Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(339)

Side by Side Diff: src/objects-inl.h

Issue 1131783003: Embedded constant pools. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix debug-mode Arm issue. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // Review notes: 5 // Review notes:
6 // 6 //
7 // - The use of macros in these inline functions may seem superfluous 7 // - The use of macros in these inline functions may seem superfluous
8 // but it is absolutely needed to make sure gcc generates optimal 8 // but it is absolutely needed to make sure gcc generates optimal
9 // code. gcc is not happy when attempting to inline too deep. 9 // code. gcc is not happy when attempting to inline too deep.
10 // 10 //
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 #define BOOL_ACCESSORS(holder, field, name, offset) \ 135 #define BOOL_ACCESSORS(holder, field, name, offset) \
136 bool holder::name() const { \ 136 bool holder::name() const { \
137 return BooleanBit::get(field(), offset); \ 137 return BooleanBit::get(field(), offset); \
138 } \ 138 } \
139 void holder::set_##name(bool value) { \ 139 void holder::set_##name(bool value) { \
140 set_##field(BooleanBit::set(field(), offset, value)); \ 140 set_##field(BooleanBit::set(field(), offset, value)); \
141 } 141 }
142 142
143 143
144 bool Object::IsFixedArrayBase() const { 144 bool Object::IsFixedArrayBase() const {
145 return IsFixedArray() || IsFixedDoubleArray() || IsConstantPoolArray() || 145 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase() ||
146 IsFixedTypedArrayBase() || IsExternalArray(); 146 IsExternalArray();
147 } 147 }
148 148
149 149
150 // External objects are not extensible, so the map check is enough. 150 // External objects are not extensible, so the map check is enough.
151 bool Object::IsExternal() const { 151 bool Object::IsExternal() const {
152 return Object::IsHeapObject() && 152 return Object::IsHeapObject() &&
153 HeapObject::cast(this)->map() == 153 HeapObject::cast(this)->map() ==
154 HeapObject::cast(this)->GetHeap()->external_map(); 154 HeapObject::cast(this)->GetHeap()->external_map();
155 } 155 }
156 156
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 TYPE_CHECKER(JSMap, JS_MAP_TYPE) 711 TYPE_CHECKER(JSMap, JS_MAP_TYPE)
712 TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE) 712 TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE)
713 TYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE) 713 TYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE)
714 TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE) 714 TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE)
715 TYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE) 715 TYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE)
716 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) 716 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE)
717 TYPE_CHECKER(Map, MAP_TYPE) 717 TYPE_CHECKER(Map, MAP_TYPE)
718 TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE) 718 TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE)
719 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) 719 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE)
720 TYPE_CHECKER(WeakFixedArray, FIXED_ARRAY_TYPE) 720 TYPE_CHECKER(WeakFixedArray, FIXED_ARRAY_TYPE)
721 TYPE_CHECKER(ConstantPoolArray, CONSTANT_POOL_ARRAY_TYPE)
722 721
723 722
724 bool Object::IsJSWeakCollection() const { 723 bool Object::IsJSWeakCollection() const {
725 return IsJSWeakMap() || IsJSWeakSet(); 724 return IsJSWeakMap() || IsJSWeakSet();
726 } 725 }
727 726
728 727
729 bool Object::IsDescriptorArray() const { 728 bool Object::IsDescriptorArray() const {
730 return IsFixedArray(); 729 return IsFixedArray();
731 } 730 }
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after
1529 if (type == SYMBOL_TYPE) { 1528 if (type == SYMBOL_TYPE) {
1530 return false; 1529 return false;
1531 } 1530 }
1532 DCHECK(type < FIRST_NONSTRING_TYPE); 1531 DCHECK(type < FIRST_NONSTRING_TYPE);
1533 // There are four string representations: sequential strings, external 1532 // There are four string representations: sequential strings, external
1534 // strings, cons strings, and sliced strings. 1533 // strings, cons strings, and sliced strings.
1535 // Only the former two contain raw values and no heap pointers (besides the 1534 // Only the former two contain raw values and no heap pointers (besides the
1536 // map-word). 1535 // map-word).
1537 return ((type & kIsIndirectStringMask) != kIsIndirectStringTag); 1536 return ((type & kIsIndirectStringMask) != kIsIndirectStringTag);
1538 } 1537 }
1539 // The ConstantPoolArray contains heap pointers, but also raw values.
1540 if (type == CONSTANT_POOL_ARRAY_TYPE) return true;
1541 return (type <= LAST_DATA_TYPE); 1538 return (type <= LAST_DATA_TYPE);
1542 } 1539 }
1543 1540
1544 1541
1545 void HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) { 1542 void HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) {
1546 v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)), 1543 v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)),
1547 reinterpret_cast<Object**>(FIELD_ADDR(this, end))); 1544 reinterpret_cast<Object**>(FIELD_ADDR(this, end)));
1548 } 1545 }
1549 1546
1550 1547
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after
2413 } 2410 }
2414 2411
2415 2412
2416 void ArrayList::Clear(int index, Object* undefined) { 2413 void ArrayList::Clear(int index, Object* undefined) {
2417 DCHECK(undefined->IsUndefined()); 2414 DCHECK(undefined->IsUndefined());
2418 FixedArray::cast(this) 2415 FixedArray::cast(this)
2419 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER); 2416 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER);
2420 } 2417 }
2421 2418
2422 2419
2423 void ConstantPoolArray::NumberOfEntries::increment(Type type) {
2424 DCHECK(type < NUMBER_OF_TYPES);
2425 element_counts_[type]++;
2426 }
2427
2428
2429 int ConstantPoolArray::NumberOfEntries::equals(
2430 const ConstantPoolArray::NumberOfEntries& other) const {
2431 for (int i = 0; i < NUMBER_OF_TYPES; i++) {
2432 if (element_counts_[i] != other.element_counts_[i]) return false;
2433 }
2434 return true;
2435 }
2436
2437
2438 bool ConstantPoolArray::NumberOfEntries::is_empty() const {
2439 return total_count() == 0;
2440 }
2441
2442
2443 int ConstantPoolArray::NumberOfEntries::count_of(Type type) const {
2444 DCHECK(type < NUMBER_OF_TYPES);
2445 return element_counts_[type];
2446 }
2447
2448
2449 int ConstantPoolArray::NumberOfEntries::base_of(Type type) const {
2450 int base = 0;
2451 DCHECK(type < NUMBER_OF_TYPES);
2452 for (int i = 0; i < type; i++) {
2453 base += element_counts_[i];
2454 }
2455 return base;
2456 }
2457
2458
2459 int ConstantPoolArray::NumberOfEntries::total_count() const {
2460 int count = 0;
2461 for (int i = 0; i < NUMBER_OF_TYPES; i++) {
2462 count += element_counts_[i];
2463 }
2464 return count;
2465 }
2466
2467
2468 int ConstantPoolArray::NumberOfEntries::are_in_range(int min, int max) const {
2469 for (int i = FIRST_TYPE; i < NUMBER_OF_TYPES; i++) {
2470 if (element_counts_[i] < min || element_counts_[i] > max) {
2471 return false;
2472 }
2473 }
2474 return true;
2475 }
2476
2477
2478 int ConstantPoolArray::Iterator::next_index() {
2479 DCHECK(!is_finished());
2480 int ret = next_index_++;
2481 update_section();
2482 return ret;
2483 }
2484
2485
2486 bool ConstantPoolArray::Iterator::is_finished() {
2487 return next_index_ > array_->last_index(type_, final_section_);
2488 }
2489
2490
2491 void ConstantPoolArray::Iterator::update_section() {
2492 if (next_index_ > array_->last_index(type_, current_section_) &&
2493 current_section_ != final_section_) {
2494 DCHECK(final_section_ == EXTENDED_SECTION);
2495 current_section_ = EXTENDED_SECTION;
2496 next_index_ = array_->first_index(type_, EXTENDED_SECTION);
2497 }
2498 }
2499
2500
2501 bool ConstantPoolArray::is_extended_layout() {
2502 uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2503 return IsExtendedField::decode(small_layout_1);
2504 }
2505
2506
2507 ConstantPoolArray::LayoutSection ConstantPoolArray::final_section() {
2508 return is_extended_layout() ? EXTENDED_SECTION : SMALL_SECTION;
2509 }
2510
2511
2512 int ConstantPoolArray::first_extended_section_index() {
2513 DCHECK(is_extended_layout());
2514 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2515 return TotalCountField::decode(small_layout_2);
2516 }
2517
2518
2519 int ConstantPoolArray::get_extended_section_header_offset() {
2520 return RoundUp(SizeFor(NumberOfEntries(this, SMALL_SECTION)), kInt64Size);
2521 }
2522
2523
2524 ConstantPoolArray::WeakObjectState ConstantPoolArray::get_weak_object_state() {
2525 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2526 return WeakObjectStateField::decode(small_layout_2);
2527 }
2528
2529
2530 void ConstantPoolArray::set_weak_object_state(
2531 ConstantPoolArray::WeakObjectState state) {
2532 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2533 small_layout_2 = WeakObjectStateField::update(small_layout_2, state);
2534 WRITE_INT32_FIELD(this, kSmallLayout2Offset, small_layout_2);
2535 }
2536
2537
2538 int ConstantPoolArray::first_index(Type type, LayoutSection section) {
2539 int index = 0;
2540 if (section == EXTENDED_SECTION) {
2541 DCHECK(is_extended_layout());
2542 index += first_extended_section_index();
2543 }
2544
2545 for (Type type_iter = FIRST_TYPE; type_iter < type;
2546 type_iter = next_type(type_iter)) {
2547 index += number_of_entries(type_iter, section);
2548 }
2549
2550 return index;
2551 }
2552
2553
2554 int ConstantPoolArray::last_index(Type type, LayoutSection section) {
2555 return first_index(type, section) + number_of_entries(type, section) - 1;
2556 }
2557
2558
2559 int ConstantPoolArray::number_of_entries(Type type, LayoutSection section) {
2560 if (section == SMALL_SECTION) {
2561 uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2562 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2563 switch (type) {
2564 case INT64:
2565 return Int64CountField::decode(small_layout_1);
2566 case CODE_PTR:
2567 return CodePtrCountField::decode(small_layout_1);
2568 case HEAP_PTR:
2569 return HeapPtrCountField::decode(small_layout_1);
2570 case INT32:
2571 return Int32CountField::decode(small_layout_2);
2572 default:
2573 UNREACHABLE();
2574 return 0;
2575 }
2576 } else {
2577 DCHECK(section == EXTENDED_SECTION && is_extended_layout());
2578 int offset = get_extended_section_header_offset();
2579 switch (type) {
2580 case INT64:
2581 offset += kExtendedInt64CountOffset;
2582 break;
2583 case CODE_PTR:
2584 offset += kExtendedCodePtrCountOffset;
2585 break;
2586 case HEAP_PTR:
2587 offset += kExtendedHeapPtrCountOffset;
2588 break;
2589 case INT32:
2590 offset += kExtendedInt32CountOffset;
2591 break;
2592 default:
2593 UNREACHABLE();
2594 }
2595 return READ_INT_FIELD(this, offset);
2596 }
2597 }
2598
2599
2600 bool ConstantPoolArray::offset_is_type(int offset, Type type) {
2601 return (offset >= OffsetOfElementAt(first_index(type, SMALL_SECTION)) &&
2602 offset <= OffsetOfElementAt(last_index(type, SMALL_SECTION))) ||
2603 (is_extended_layout() &&
2604 offset >= OffsetOfElementAt(first_index(type, EXTENDED_SECTION)) &&
2605 offset <= OffsetOfElementAt(last_index(type, EXTENDED_SECTION)));
2606 }
2607
2608
2609 ConstantPoolArray::Type ConstantPoolArray::get_type(int index) {
2610 LayoutSection section;
2611 if (is_extended_layout() && index >= first_extended_section_index()) {
2612 section = EXTENDED_SECTION;
2613 } else {
2614 section = SMALL_SECTION;
2615 }
2616
2617 Type type = FIRST_TYPE;
2618 while (index > last_index(type, section)) {
2619 type = next_type(type);
2620 }
2621 DCHECK(type <= LAST_TYPE);
2622 return type;
2623 }
2624
2625
2626 int64_t ConstantPoolArray::get_int64_entry(int index) {
2627 DCHECK(map() == GetHeap()->constant_pool_array_map());
2628 DCHECK(get_type(index) == INT64);
2629 return READ_INT64_FIELD(this, OffsetOfElementAt(index));
2630 }
2631
2632
2633 double ConstantPoolArray::get_int64_entry_as_double(int index) {
2634 STATIC_ASSERT(kDoubleSize == kInt64Size);
2635 DCHECK(map() == GetHeap()->constant_pool_array_map());
2636 DCHECK(get_type(index) == INT64);
2637 return READ_DOUBLE_FIELD(this, OffsetOfElementAt(index));
2638 }
2639
2640
2641 Address ConstantPoolArray::get_code_ptr_entry(int index) {
2642 DCHECK(map() == GetHeap()->constant_pool_array_map());
2643 DCHECK(get_type(index) == CODE_PTR);
2644 return reinterpret_cast<Address>(READ_FIELD(this, OffsetOfElementAt(index)));
2645 }
2646
2647
2648 Object* ConstantPoolArray::get_heap_ptr_entry(int index) {
2649 DCHECK(map() == GetHeap()->constant_pool_array_map());
2650 DCHECK(get_type(index) == HEAP_PTR);
2651 return READ_FIELD(this, OffsetOfElementAt(index));
2652 }
2653
2654
2655 int32_t ConstantPoolArray::get_int32_entry(int index) {
2656 DCHECK(map() == GetHeap()->constant_pool_array_map());
2657 DCHECK(get_type(index) == INT32);
2658 return READ_INT32_FIELD(this, OffsetOfElementAt(index));
2659 }
2660
2661
2662 void ConstantPoolArray::set(int index, int64_t value) {
2663 DCHECK(map() == GetHeap()->constant_pool_array_map());
2664 DCHECK(get_type(index) == INT64);
2665 WRITE_INT64_FIELD(this, OffsetOfElementAt(index), value);
2666 }
2667
2668
2669 void ConstantPoolArray::set(int index, double value) {
2670 STATIC_ASSERT(kDoubleSize == kInt64Size);
2671 DCHECK(map() == GetHeap()->constant_pool_array_map());
2672 DCHECK(get_type(index) == INT64);
2673 WRITE_DOUBLE_FIELD(this, OffsetOfElementAt(index), value);
2674 }
2675
2676
2677 void ConstantPoolArray::set(int index, Address value) {
2678 DCHECK(map() == GetHeap()->constant_pool_array_map());
2679 DCHECK(get_type(index) == CODE_PTR);
2680 WRITE_FIELD(this, OffsetOfElementAt(index), reinterpret_cast<Object*>(value));
2681 }
2682
2683
2684 void ConstantPoolArray::set(int index, Object* value) {
2685 DCHECK(map() == GetHeap()->constant_pool_array_map());
2686 DCHECK(!GetHeap()->InNewSpace(value));
2687 DCHECK(get_type(index) == HEAP_PTR);
2688 WRITE_FIELD(this, OffsetOfElementAt(index), value);
2689 WRITE_BARRIER(GetHeap(), this, OffsetOfElementAt(index), value);
2690 }
2691
2692
2693 void ConstantPoolArray::set(int index, int32_t value) {
2694 DCHECK(map() == GetHeap()->constant_pool_array_map());
2695 DCHECK(get_type(index) == INT32);
2696 WRITE_INT32_FIELD(this, OffsetOfElementAt(index), value);
2697 }
2698
2699
2700 void ConstantPoolArray::set_at_offset(int offset, int32_t value) {
2701 DCHECK(map() == GetHeap()->constant_pool_array_map());
2702 DCHECK(offset_is_type(offset, INT32));
2703 WRITE_INT32_FIELD(this, offset, value);
2704 }
2705
2706
2707 void ConstantPoolArray::set_at_offset(int offset, int64_t value) {
2708 DCHECK(map() == GetHeap()->constant_pool_array_map());
2709 DCHECK(offset_is_type(offset, INT64));
2710 WRITE_INT64_FIELD(this, offset, value);
2711 }
2712
2713
2714 void ConstantPoolArray::set_at_offset(int offset, double value) {
2715 DCHECK(map() == GetHeap()->constant_pool_array_map());
2716 DCHECK(offset_is_type(offset, INT64));
2717 WRITE_DOUBLE_FIELD(this, offset, value);
2718 }
2719
2720
2721 void ConstantPoolArray::set_at_offset(int offset, Address value) {
2722 DCHECK(map() == GetHeap()->constant_pool_array_map());
2723 DCHECK(offset_is_type(offset, CODE_PTR));
2724 WRITE_FIELD(this, offset, reinterpret_cast<Object*>(value));
2725 WRITE_BARRIER(GetHeap(), this, offset, reinterpret_cast<Object*>(value));
2726 }
2727
2728
2729 void ConstantPoolArray::set_at_offset(int offset, Object* value) {
2730 DCHECK(map() == GetHeap()->constant_pool_array_map());
2731 DCHECK(!GetHeap()->InNewSpace(value));
2732 DCHECK(offset_is_type(offset, HEAP_PTR));
2733 WRITE_FIELD(this, offset, value);
2734 WRITE_BARRIER(GetHeap(), this, offset, value);
2735 }
2736
2737
2738 void ConstantPoolArray::Init(const NumberOfEntries& small) {
2739 uint32_t small_layout_1 =
2740 Int64CountField::encode(small.count_of(INT64)) |
2741 CodePtrCountField::encode(small.count_of(CODE_PTR)) |
2742 HeapPtrCountField::encode(small.count_of(HEAP_PTR)) |
2743 IsExtendedField::encode(false);
2744 uint32_t small_layout_2 =
2745 Int32CountField::encode(small.count_of(INT32)) |
2746 TotalCountField::encode(small.total_count()) |
2747 WeakObjectStateField::encode(NO_WEAK_OBJECTS);
2748 WRITE_UINT32_FIELD(this, kSmallLayout1Offset, small_layout_1);
2749 WRITE_UINT32_FIELD(this, kSmallLayout2Offset, small_layout_2);
2750 if (kHeaderSize != kFirstEntryOffset) {
2751 DCHECK(kFirstEntryOffset - kHeaderSize == kInt32Size);
2752 WRITE_UINT32_FIELD(this, kHeaderSize, 0); // Zero out header padding.
2753 }
2754 }
2755
2756
2757 void ConstantPoolArray::InitExtended(const NumberOfEntries& small,
2758 const NumberOfEntries& extended) {
2759 // Initialize small layout fields first.
2760 Init(small);
2761
2762 // Set is_extended_layout field.
2763 uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2764 small_layout_1 = IsExtendedField::update(small_layout_1, true);
2765 WRITE_INT32_FIELD(this, kSmallLayout1Offset, small_layout_1);
2766
2767 // Initialize the extended layout fields.
2768 int extended_header_offset = get_extended_section_header_offset();
2769 WRITE_INT32_FIELD(this, extended_header_offset + kExtendedInt64CountOffset,
2770 extended.count_of(INT64));
2771 WRITE_INT32_FIELD(this, extended_header_offset + kExtendedCodePtrCountOffset,
2772 extended.count_of(CODE_PTR));
2773 WRITE_INT32_FIELD(this, extended_header_offset + kExtendedHeapPtrCountOffset,
2774 extended.count_of(HEAP_PTR));
2775 WRITE_INT32_FIELD(this, extended_header_offset + kExtendedInt32CountOffset,
2776 extended.count_of(INT32));
2777 }
2778
2779
2780 int ConstantPoolArray::size() {
2781 NumberOfEntries small(this, SMALL_SECTION);
2782 if (!is_extended_layout()) {
2783 return SizeFor(small);
2784 } else {
2785 NumberOfEntries extended(this, EXTENDED_SECTION);
2786 return SizeForExtended(small, extended);
2787 }
2788 }
2789
2790
2791 int ConstantPoolArray::length() {
2792 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2793 int length = TotalCountField::decode(small_layout_2);
2794 if (is_extended_layout()) {
2795 length += number_of_entries(INT64, EXTENDED_SECTION) +
2796 number_of_entries(CODE_PTR, EXTENDED_SECTION) +
2797 number_of_entries(HEAP_PTR, EXTENDED_SECTION) +
2798 number_of_entries(INT32, EXTENDED_SECTION);
2799 }
2800 return length;
2801 }
2802
2803
2804 WriteBarrierMode HeapObject::GetWriteBarrierMode( 2420 WriteBarrierMode HeapObject::GetWriteBarrierMode(
2805 const DisallowHeapAllocation& promise) { 2421 const DisallowHeapAllocation& promise) {
2806 Heap* heap = GetHeap(); 2422 Heap* heap = GetHeap();
2807 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; 2423 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
2808 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; 2424 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
2809 return UPDATE_WRITE_BARRIER; 2425 return UPDATE_WRITE_BARRIER;
2810 } 2426 }
2811 2427
2812 2428
2813 AllocationAlignment HeapObject::RequiredAlignment() { 2429 AllocationAlignment HeapObject::RequiredAlignment() {
2814 #ifdef V8_HOST_ARCH_32_BIT 2430 #ifdef V8_HOST_ARCH_32_BIT
2815 if ((IsFixedFloat64Array() || IsFixedDoubleArray() || 2431 if ((IsFixedFloat64Array() || IsFixedDoubleArray()) &&
2816 IsConstantPoolArray()) &&
2817 FixedArrayBase::cast(this)->length() != 0) { 2432 FixedArrayBase::cast(this)->length() != 0) {
2818 return kDoubleAligned; 2433 return kDoubleAligned;
2819 } 2434 }
2820 if (IsHeapNumber()) return kDoubleUnaligned; 2435 if (IsHeapNumber()) return kDoubleUnaligned;
2821 #endif // V8_HOST_ARCH_32_BIT 2436 #endif // V8_HOST_ARCH_32_BIT
2822 return kWordAligned; 2437 return kWordAligned;
2823 } 2438 }
2824 2439
2825 2440
2826 void FixedArray::set(int index, 2441 void FixedArray::set(int index,
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
3330 2945
3331 2946
3332 CAST_ACCESSOR(AccessorInfo) 2947 CAST_ACCESSOR(AccessorInfo)
3333 CAST_ACCESSOR(ArrayList) 2948 CAST_ACCESSOR(ArrayList)
3334 CAST_ACCESSOR(ByteArray) 2949 CAST_ACCESSOR(ByteArray)
3335 CAST_ACCESSOR(Cell) 2950 CAST_ACCESSOR(Cell)
3336 CAST_ACCESSOR(Code) 2951 CAST_ACCESSOR(Code)
3337 CAST_ACCESSOR(CodeCacheHashTable) 2952 CAST_ACCESSOR(CodeCacheHashTable)
3338 CAST_ACCESSOR(CompilationCacheTable) 2953 CAST_ACCESSOR(CompilationCacheTable)
3339 CAST_ACCESSOR(ConsString) 2954 CAST_ACCESSOR(ConsString)
3340 CAST_ACCESSOR(ConstantPoolArray)
3341 CAST_ACCESSOR(DeoptimizationInputData) 2955 CAST_ACCESSOR(DeoptimizationInputData)
3342 CAST_ACCESSOR(DeoptimizationOutputData) 2956 CAST_ACCESSOR(DeoptimizationOutputData)
3343 CAST_ACCESSOR(DependentCode) 2957 CAST_ACCESSOR(DependentCode)
3344 CAST_ACCESSOR(DescriptorArray) 2958 CAST_ACCESSOR(DescriptorArray)
3345 CAST_ACCESSOR(ExternalArray) 2959 CAST_ACCESSOR(ExternalArray)
3346 CAST_ACCESSOR(ExternalOneByteString) 2960 CAST_ACCESSOR(ExternalOneByteString)
3347 CAST_ACCESSOR(ExternalFloat32Array) 2961 CAST_ACCESSOR(ExternalFloat32Array)
3348 CAST_ACCESSOR(ExternalFloat64Array) 2962 CAST_ACCESSOR(ExternalFloat64Array)
3349 CAST_ACCESSOR(ExternalInt16Array) 2963 CAST_ACCESSOR(ExternalInt16Array)
3350 CAST_ACCESSOR(ExternalInt32Array) 2964 CAST_ACCESSOR(ExternalInt32Array)
(...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after
4520 instance_type == INTERNALIZED_STRING_TYPE) { 4134 instance_type == INTERNALIZED_STRING_TYPE) {
4521 // Strings may get concurrently truncated, hence we have to access its 4135 // Strings may get concurrently truncated, hence we have to access its
4522 // length synchronized. 4136 // length synchronized.
4523 return SeqTwoByteString::SizeFor( 4137 return SeqTwoByteString::SizeFor(
4524 reinterpret_cast<SeqTwoByteString*>(this)->synchronized_length()); 4138 reinterpret_cast<SeqTwoByteString*>(this)->synchronized_length());
4525 } 4139 }
4526 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) { 4140 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
4527 return FixedDoubleArray::SizeFor( 4141 return FixedDoubleArray::SizeFor(
4528 reinterpret_cast<FixedDoubleArray*>(this)->length()); 4142 reinterpret_cast<FixedDoubleArray*>(this)->length());
4529 } 4143 }
4530 if (instance_type == CONSTANT_POOL_ARRAY_TYPE) {
4531 return reinterpret_cast<ConstantPoolArray*>(this)->size();
4532 }
4533 if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE && 4144 if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
4534 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) { 4145 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) {
4535 return reinterpret_cast<FixedTypedArrayBase*>( 4146 return reinterpret_cast<FixedTypedArrayBase*>(
4536 this)->TypedArraySize(instance_type); 4147 this)->TypedArraySize(instance_type);
4537 } 4148 }
4538 DCHECK(instance_type == CODE_TYPE); 4149 DCHECK(instance_type == CODE_TYPE);
4539 return reinterpret_cast<Code*>(this)->CodeSize(); 4150 return reinterpret_cast<Code*>(this)->CodeSize();
4540 } 4151 }
4541 4152
4542 4153
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
5125 bool Code::is_keyed_stub() { 4736 bool Code::is_keyed_stub() {
5126 return is_keyed_load_stub() || is_keyed_store_stub(); 4737 return is_keyed_load_stub() || is_keyed_store_stub();
5127 } 4738 }
5128 4739
5129 4740
5130 bool Code::is_debug_stub() { 4741 bool Code::is_debug_stub() {
5131 return ic_state() == DEBUG_STUB; 4742 return ic_state() == DEBUG_STUB;
5132 } 4743 }
5133 4744
5134 4745
5135 ConstantPoolArray* Code::constant_pool() { 4746 Address Code::constant_pool() {
5136 return ConstantPoolArray::cast(READ_FIELD(this, kConstantPoolOffset)); 4747 Address constant_pool = NULL;
4748 if (FLAG_enable_embedded_constant_pool) {
4749 int offset = constant_pool_offset();
4750 if (offset < instruction_size()) {
4751 constant_pool = FIELD_ADDR(this, kHeaderSize + offset);
4752 }
4753 }
4754 return constant_pool;
5137 } 4755 }
5138 4756
5139 4757
5140 void Code::set_constant_pool(Object* value) {
5141 DCHECK(value->IsConstantPoolArray());
5142 WRITE_FIELD(this, kConstantPoolOffset, value);
5143 WRITE_BARRIER(GetHeap(), this, kConstantPoolOffset, value);
5144 }
5145
5146
5147 Code::Flags Code::ComputeFlags(Kind kind, InlineCacheState ic_state, 4758 Code::Flags Code::ComputeFlags(Kind kind, InlineCacheState ic_state,
5148 ExtraICState extra_ic_state, StubType type, 4759 ExtraICState extra_ic_state, StubType type,
5149 CacheHolderFlag holder) { 4760 CacheHolderFlag holder) {
5150 // Compute the bit mask. 4761 // Compute the bit mask.
5151 unsigned int bits = KindField::encode(kind) 4762 unsigned int bits = KindField::encode(kind)
5152 | ICStateField::encode(ic_state) 4763 | ICStateField::encode(ic_state)
5153 | TypeField::encode(type) 4764 | TypeField::encode(type)
5154 | ExtraICStateField::encode(extra_ic_state) 4765 | ExtraICStateField::encode(extra_ic_state)
5155 | CacheHolderField::encode(holder); 4766 | CacheHolderField::encode(holder);
5156 return static_cast<Flags>(bits); 4767 return static_cast<Flags>(bits);
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after
6311 SMI_ACCESSORS(JSMessageObject, type, kTypeOffset) 5922 SMI_ACCESSORS(JSMessageObject, type, kTypeOffset)
6312 ACCESSORS(JSMessageObject, argument, Object, kArgumentsOffset) 5923 ACCESSORS(JSMessageObject, argument, Object, kArgumentsOffset)
6313 ACCESSORS(JSMessageObject, script, Object, kScriptOffset) 5924 ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
6314 ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset) 5925 ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
6315 SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset) 5926 SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
6316 SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset) 5927 SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
6317 5928
6318 5929
6319 INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset) 5930 INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
6320 INT_ACCESSORS(Code, prologue_offset, kPrologueOffset) 5931 INT_ACCESSORS(Code, prologue_offset, kPrologueOffset)
5932 INT_ACCESSORS(Code, constant_pool_offset, kConstantPoolOffset)
6321 ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset) 5933 ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
6322 ACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset) 5934 ACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset)
6323 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset) 5935 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
6324 ACCESSORS(Code, raw_type_feedback_info, Object, kTypeFeedbackInfoOffset) 5936 ACCESSORS(Code, raw_type_feedback_info, Object, kTypeFeedbackInfoOffset)
6325 ACCESSORS(Code, next_code_link, Object, kNextCodeLinkOffset) 5937 ACCESSORS(Code, next_code_link, Object, kNextCodeLinkOffset)
6326 5938
6327 5939
6328 void Code::WipeOutHeader() { 5940 void Code::WipeOutHeader() {
6329 WRITE_FIELD(this, kRelocationInfoOffset, NULL); 5941 WRITE_FIELD(this, kRelocationInfoOffset, NULL);
6330 WRITE_FIELD(this, kHandlerTableOffset, NULL); 5942 WRITE_FIELD(this, kHandlerTableOffset, NULL);
6331 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL); 5943 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL);
6332 WRITE_FIELD(this, kConstantPoolOffset, NULL);
6333 // Do not wipe out major/minor keys on a code stub or IC 5944 // Do not wipe out major/minor keys on a code stub or IC
6334 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) { 5945 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) {
6335 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL); 5946 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL);
6336 } 5947 }
6337 } 5948 }
6338 5949
6339 5950
6340 Object* Code::type_feedback_info() { 5951 Object* Code::type_feedback_info() {
6341 DCHECK(kind() == FUNCTION); 5952 DCHECK(kind() == FUNCTION);
6342 return raw_type_feedback_info(); 5953 return raw_type_feedback_info();
(...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after
7715 #undef READ_SHORT_FIELD 7326 #undef READ_SHORT_FIELD
7716 #undef WRITE_SHORT_FIELD 7327 #undef WRITE_SHORT_FIELD
7717 #undef READ_BYTE_FIELD 7328 #undef READ_BYTE_FIELD
7718 #undef WRITE_BYTE_FIELD 7329 #undef WRITE_BYTE_FIELD
7719 #undef NOBARRIER_READ_BYTE_FIELD 7330 #undef NOBARRIER_READ_BYTE_FIELD
7720 #undef NOBARRIER_WRITE_BYTE_FIELD 7331 #undef NOBARRIER_WRITE_BYTE_FIELD
7721 7332
7722 } } // namespace v8::internal 7333 } } // namespace v8::internal
7723 7334
7724 #endif // V8_OBJECTS_INL_H_ 7335 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698