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

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: Created 5 years, 7 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
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 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 TYPE_CHECKER(JSMap, JS_MAP_TYPE) 693 TYPE_CHECKER(JSMap, JS_MAP_TYPE)
694 TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE) 694 TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE)
695 TYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE) 695 TYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE)
696 TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE) 696 TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE)
697 TYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE) 697 TYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE)
698 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) 698 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE)
699 TYPE_CHECKER(Map, MAP_TYPE) 699 TYPE_CHECKER(Map, MAP_TYPE)
700 TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE) 700 TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE)
701 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) 701 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE)
702 TYPE_CHECKER(WeakFixedArray, FIXED_ARRAY_TYPE) 702 TYPE_CHECKER(WeakFixedArray, FIXED_ARRAY_TYPE)
703 TYPE_CHECKER(ConstantPoolArray, CONSTANT_POOL_ARRAY_TYPE)
704 703
705 704
706 bool Object::IsJSWeakCollection() const { 705 bool Object::IsJSWeakCollection() const {
707 return IsJSWeakMap() || IsJSWeakSet(); 706 return IsJSWeakMap() || IsJSWeakSet();
708 } 707 }
709 708
710 709
711 bool Object::IsDescriptorArray() const { 710 bool Object::IsDescriptorArray() const {
712 return IsFixedArray(); 711 return IsFixedArray();
713 } 712 }
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after
1536 if (type == SYMBOL_TYPE) { 1535 if (type == SYMBOL_TYPE) {
1537 return false; 1536 return false;
1538 } 1537 }
1539 DCHECK(type < FIRST_NONSTRING_TYPE); 1538 DCHECK(type < FIRST_NONSTRING_TYPE);
1540 // There are four string representations: sequential strings, external 1539 // There are four string representations: sequential strings, external
1541 // strings, cons strings, and sliced strings. 1540 // strings, cons strings, and sliced strings.
1542 // Only the former two contain raw values and no heap pointers (besides the 1541 // Only the former two contain raw values and no heap pointers (besides the
1543 // map-word). 1542 // map-word).
1544 return ((type & kIsIndirectStringMask) != kIsIndirectStringTag); 1543 return ((type & kIsIndirectStringMask) != kIsIndirectStringTag);
1545 } 1544 }
1546 // The ConstantPoolArray contains heap pointers, but also raw values.
1547 if (type == CONSTANT_POOL_ARRAY_TYPE) return true;
1548 return (type <= LAST_DATA_TYPE); 1545 return (type <= LAST_DATA_TYPE);
1549 } 1546 }
1550 1547
1551 1548
1552 void HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) { 1549 void HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) {
1553 v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)), 1550 v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)),
1554 reinterpret_cast<Object**>(FIELD_ADDR(this, end))); 1551 reinterpret_cast<Object**>(FIELD_ADDR(this, end)));
1555 } 1552 }
1556 1553
1557 1554
(...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after
2414 } 2411 }
2415 2412
2416 2413
2417 void ArrayList::Clear(int index, Object* undefined) { 2414 void ArrayList::Clear(int index, Object* undefined) {
2418 DCHECK(undefined->IsUndefined()); 2415 DCHECK(undefined->IsUndefined());
2419 FixedArray::cast(this) 2416 FixedArray::cast(this)
2420 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER); 2417 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER);
2421 } 2418 }
2422 2419
2423 2420
2424 void ConstantPoolArray::NumberOfEntries::increment(Type type) {
2425 DCHECK(type < NUMBER_OF_TYPES);
2426 element_counts_[type]++;
2427 }
2428
2429
2430 int ConstantPoolArray::NumberOfEntries::equals(
2431 const ConstantPoolArray::NumberOfEntries& other) const {
2432 for (int i = 0; i < NUMBER_OF_TYPES; i++) {
2433 if (element_counts_[i] != other.element_counts_[i]) return false;
2434 }
2435 return true;
2436 }
2437
2438
2439 bool ConstantPoolArray::NumberOfEntries::is_empty() const {
2440 return total_count() == 0;
2441 }
2442
2443
2444 int ConstantPoolArray::NumberOfEntries::count_of(Type type) const {
2445 DCHECK(type < NUMBER_OF_TYPES);
2446 return element_counts_[type];
2447 }
2448
2449
2450 int ConstantPoolArray::NumberOfEntries::base_of(Type type) const {
2451 int base = 0;
2452 DCHECK(type < NUMBER_OF_TYPES);
2453 for (int i = 0; i < type; i++) {
2454 base += element_counts_[i];
2455 }
2456 return base;
2457 }
2458
2459
2460 int ConstantPoolArray::NumberOfEntries::total_count() const {
2461 int count = 0;
2462 for (int i = 0; i < NUMBER_OF_TYPES; i++) {
2463 count += element_counts_[i];
2464 }
2465 return count;
2466 }
2467
2468
2469 int ConstantPoolArray::NumberOfEntries::are_in_range(int min, int max) const {
2470 for (int i = FIRST_TYPE; i < NUMBER_OF_TYPES; i++) {
2471 if (element_counts_[i] < min || element_counts_[i] > max) {
2472 return false;
2473 }
2474 }
2475 return true;
2476 }
2477
2478
2479 int ConstantPoolArray::Iterator::next_index() {
2480 DCHECK(!is_finished());
2481 int ret = next_index_++;
2482 update_section();
2483 return ret;
2484 }
2485
2486
2487 bool ConstantPoolArray::Iterator::is_finished() {
2488 return next_index_ > array_->last_index(type_, final_section_);
2489 }
2490
2491
2492 void ConstantPoolArray::Iterator::update_section() {
2493 if (next_index_ > array_->last_index(type_, current_section_) &&
2494 current_section_ != final_section_) {
2495 DCHECK(final_section_ == EXTENDED_SECTION);
2496 current_section_ = EXTENDED_SECTION;
2497 next_index_ = array_->first_index(type_, EXTENDED_SECTION);
2498 }
2499 }
2500
2501
2502 bool ConstantPoolArray::is_extended_layout() {
2503 uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2504 return IsExtendedField::decode(small_layout_1);
2505 }
2506
2507
2508 ConstantPoolArray::LayoutSection ConstantPoolArray::final_section() {
2509 return is_extended_layout() ? EXTENDED_SECTION : SMALL_SECTION;
2510 }
2511
2512
2513 int ConstantPoolArray::first_extended_section_index() {
2514 DCHECK(is_extended_layout());
2515 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2516 return TotalCountField::decode(small_layout_2);
2517 }
2518
2519
2520 int ConstantPoolArray::get_extended_section_header_offset() {
2521 return RoundUp(SizeFor(NumberOfEntries(this, SMALL_SECTION)), kInt64Size);
2522 }
2523
2524
2525 ConstantPoolArray::WeakObjectState ConstantPoolArray::get_weak_object_state() {
2526 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2527 return WeakObjectStateField::decode(small_layout_2);
2528 }
2529
2530
2531 void ConstantPoolArray::set_weak_object_state(
2532 ConstantPoolArray::WeakObjectState state) {
2533 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2534 small_layout_2 = WeakObjectStateField::update(small_layout_2, state);
2535 WRITE_INT32_FIELD(this, kSmallLayout2Offset, small_layout_2);
2536 }
2537
2538
2539 int ConstantPoolArray::first_index(Type type, LayoutSection section) {
2540 int index = 0;
2541 if (section == EXTENDED_SECTION) {
2542 DCHECK(is_extended_layout());
2543 index += first_extended_section_index();
2544 }
2545
2546 for (Type type_iter = FIRST_TYPE; type_iter < type;
2547 type_iter = next_type(type_iter)) {
2548 index += number_of_entries(type_iter, section);
2549 }
2550
2551 return index;
2552 }
2553
2554
2555 int ConstantPoolArray::last_index(Type type, LayoutSection section) {
2556 return first_index(type, section) + number_of_entries(type, section) - 1;
2557 }
2558
2559
2560 int ConstantPoolArray::number_of_entries(Type type, LayoutSection section) {
2561 if (section == SMALL_SECTION) {
2562 uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2563 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2564 switch (type) {
2565 case INT64:
2566 return Int64CountField::decode(small_layout_1);
2567 case CODE_PTR:
2568 return CodePtrCountField::decode(small_layout_1);
2569 case HEAP_PTR:
2570 return HeapPtrCountField::decode(small_layout_1);
2571 case INT32:
2572 return Int32CountField::decode(small_layout_2);
2573 default:
2574 UNREACHABLE();
2575 return 0;
2576 }
2577 } else {
2578 DCHECK(section == EXTENDED_SECTION && is_extended_layout());
2579 int offset = get_extended_section_header_offset();
2580 switch (type) {
2581 case INT64:
2582 offset += kExtendedInt64CountOffset;
2583 break;
2584 case CODE_PTR:
2585 offset += kExtendedCodePtrCountOffset;
2586 break;
2587 case HEAP_PTR:
2588 offset += kExtendedHeapPtrCountOffset;
2589 break;
2590 case INT32:
2591 offset += kExtendedInt32CountOffset;
2592 break;
2593 default:
2594 UNREACHABLE();
2595 }
2596 return READ_INT_FIELD(this, offset);
2597 }
2598 }
2599
2600
2601 bool ConstantPoolArray::offset_is_type(int offset, Type type) {
2602 return (offset >= OffsetOfElementAt(first_index(type, SMALL_SECTION)) &&
2603 offset <= OffsetOfElementAt(last_index(type, SMALL_SECTION))) ||
2604 (is_extended_layout() &&
2605 offset >= OffsetOfElementAt(first_index(type, EXTENDED_SECTION)) &&
2606 offset <= OffsetOfElementAt(last_index(type, EXTENDED_SECTION)));
2607 }
2608
2609
2610 ConstantPoolArray::Type ConstantPoolArray::get_type(int index) {
2611 LayoutSection section;
2612 if (is_extended_layout() && index >= first_extended_section_index()) {
2613 section = EXTENDED_SECTION;
2614 } else {
2615 section = SMALL_SECTION;
2616 }
2617
2618 Type type = FIRST_TYPE;
2619 while (index > last_index(type, section)) {
2620 type = next_type(type);
2621 }
2622 DCHECK(type <= LAST_TYPE);
2623 return type;
2624 }
2625
2626
2627 int64_t ConstantPoolArray::get_int64_entry(int index) {
2628 DCHECK(map() == GetHeap()->constant_pool_array_map());
2629 DCHECK(get_type(index) == INT64);
2630 return READ_INT64_FIELD(this, OffsetOfElementAt(index));
2631 }
2632
2633
2634 double ConstantPoolArray::get_int64_entry_as_double(int index) {
2635 STATIC_ASSERT(kDoubleSize == kInt64Size);
2636 DCHECK(map() == GetHeap()->constant_pool_array_map());
2637 DCHECK(get_type(index) == INT64);
2638 return READ_DOUBLE_FIELD(this, OffsetOfElementAt(index));
2639 }
2640
2641
2642 Address ConstantPoolArray::get_code_ptr_entry(int index) {
2643 DCHECK(map() == GetHeap()->constant_pool_array_map());
2644 DCHECK(get_type(index) == CODE_PTR);
2645 return reinterpret_cast<Address>(READ_FIELD(this, OffsetOfElementAt(index)));
2646 }
2647
2648
2649 Object* ConstantPoolArray::get_heap_ptr_entry(int index) {
2650 DCHECK(map() == GetHeap()->constant_pool_array_map());
2651 DCHECK(get_type(index) == HEAP_PTR);
2652 return READ_FIELD(this, OffsetOfElementAt(index));
2653 }
2654
2655
2656 int32_t ConstantPoolArray::get_int32_entry(int index) {
2657 DCHECK(map() == GetHeap()->constant_pool_array_map());
2658 DCHECK(get_type(index) == INT32);
2659 return READ_INT32_FIELD(this, OffsetOfElementAt(index));
2660 }
2661
2662
2663 void ConstantPoolArray::set(int index, int64_t value) {
2664 DCHECK(map() == GetHeap()->constant_pool_array_map());
2665 DCHECK(get_type(index) == INT64);
2666 WRITE_INT64_FIELD(this, OffsetOfElementAt(index), value);
2667 }
2668
2669
2670 void ConstantPoolArray::set(int index, double value) {
2671 STATIC_ASSERT(kDoubleSize == kInt64Size);
2672 DCHECK(map() == GetHeap()->constant_pool_array_map());
2673 DCHECK(get_type(index) == INT64);
2674 WRITE_DOUBLE_FIELD(this, OffsetOfElementAt(index), value);
2675 }
2676
2677
2678 void ConstantPoolArray::set(int index, Address value) {
2679 DCHECK(map() == GetHeap()->constant_pool_array_map());
2680 DCHECK(get_type(index) == CODE_PTR);
2681 WRITE_FIELD(this, OffsetOfElementAt(index), reinterpret_cast<Object*>(value));
2682 }
2683
2684
2685 void ConstantPoolArray::set(int index, Object* value) {
2686 DCHECK(map() == GetHeap()->constant_pool_array_map());
2687 DCHECK(!GetHeap()->InNewSpace(value));
2688 DCHECK(get_type(index) == HEAP_PTR);
2689 WRITE_FIELD(this, OffsetOfElementAt(index), value);
2690 WRITE_BARRIER(GetHeap(), this, OffsetOfElementAt(index), value);
2691 }
2692
2693
2694 void ConstantPoolArray::set(int index, int32_t value) {
2695 DCHECK(map() == GetHeap()->constant_pool_array_map());
2696 DCHECK(get_type(index) == INT32);
2697 WRITE_INT32_FIELD(this, OffsetOfElementAt(index), value);
2698 }
2699
2700
2701 void ConstantPoolArray::set_at_offset(int offset, int32_t value) {
2702 DCHECK(map() == GetHeap()->constant_pool_array_map());
2703 DCHECK(offset_is_type(offset, INT32));
2704 WRITE_INT32_FIELD(this, offset, value);
2705 }
2706
2707
2708 void ConstantPoolArray::set_at_offset(int offset, int64_t value) {
2709 DCHECK(map() == GetHeap()->constant_pool_array_map());
2710 DCHECK(offset_is_type(offset, INT64));
2711 WRITE_INT64_FIELD(this, offset, value);
2712 }
2713
2714
2715 void ConstantPoolArray::set_at_offset(int offset, double value) {
2716 DCHECK(map() == GetHeap()->constant_pool_array_map());
2717 DCHECK(offset_is_type(offset, INT64));
2718 WRITE_DOUBLE_FIELD(this, offset, value);
2719 }
2720
2721
2722 void ConstantPoolArray::set_at_offset(int offset, Address value) {
2723 DCHECK(map() == GetHeap()->constant_pool_array_map());
2724 DCHECK(offset_is_type(offset, CODE_PTR));
2725 WRITE_FIELD(this, offset, reinterpret_cast<Object*>(value));
2726 WRITE_BARRIER(GetHeap(), this, offset, reinterpret_cast<Object*>(value));
2727 }
2728
2729
2730 void ConstantPoolArray::set_at_offset(int offset, Object* value) {
2731 DCHECK(map() == GetHeap()->constant_pool_array_map());
2732 DCHECK(!GetHeap()->InNewSpace(value));
2733 DCHECK(offset_is_type(offset, HEAP_PTR));
2734 WRITE_FIELD(this, offset, value);
2735 WRITE_BARRIER(GetHeap(), this, offset, value);
2736 }
2737
2738
2739 void ConstantPoolArray::Init(const NumberOfEntries& small) {
2740 uint32_t small_layout_1 =
2741 Int64CountField::encode(small.count_of(INT64)) |
2742 CodePtrCountField::encode(small.count_of(CODE_PTR)) |
2743 HeapPtrCountField::encode(small.count_of(HEAP_PTR)) |
2744 IsExtendedField::encode(false);
2745 uint32_t small_layout_2 =
2746 Int32CountField::encode(small.count_of(INT32)) |
2747 TotalCountField::encode(small.total_count()) |
2748 WeakObjectStateField::encode(NO_WEAK_OBJECTS);
2749 WRITE_UINT32_FIELD(this, kSmallLayout1Offset, small_layout_1);
2750 WRITE_UINT32_FIELD(this, kSmallLayout2Offset, small_layout_2);
2751 if (kHeaderSize != kFirstEntryOffset) {
2752 DCHECK(kFirstEntryOffset - kHeaderSize == kInt32Size);
2753 WRITE_UINT32_FIELD(this, kHeaderSize, 0); // Zero out header padding.
2754 }
2755 }
2756
2757
2758 void ConstantPoolArray::InitExtended(const NumberOfEntries& small,
2759 const NumberOfEntries& extended) {
2760 // Initialize small layout fields first.
2761 Init(small);
2762
2763 // Set is_extended_layout field.
2764 uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2765 small_layout_1 = IsExtendedField::update(small_layout_1, true);
2766 WRITE_INT32_FIELD(this, kSmallLayout1Offset, small_layout_1);
2767
2768 // Initialize the extended layout fields.
2769 int extended_header_offset = get_extended_section_header_offset();
2770 WRITE_INT32_FIELD(this, extended_header_offset + kExtendedInt64CountOffset,
2771 extended.count_of(INT64));
2772 WRITE_INT32_FIELD(this, extended_header_offset + kExtendedCodePtrCountOffset,
2773 extended.count_of(CODE_PTR));
2774 WRITE_INT32_FIELD(this, extended_header_offset + kExtendedHeapPtrCountOffset,
2775 extended.count_of(HEAP_PTR));
2776 WRITE_INT32_FIELD(this, extended_header_offset + kExtendedInt32CountOffset,
2777 extended.count_of(INT32));
2778 }
2779
2780
2781 int ConstantPoolArray::size() {
2782 NumberOfEntries small(this, SMALL_SECTION);
2783 if (!is_extended_layout()) {
2784 return SizeFor(small);
2785 } else {
2786 NumberOfEntries extended(this, EXTENDED_SECTION);
2787 return SizeForExtended(small, extended);
2788 }
2789 }
2790
2791
2792 int ConstantPoolArray::length() {
2793 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2794 int length = TotalCountField::decode(small_layout_2);
2795 if (is_extended_layout()) {
2796 length += number_of_entries(INT64, EXTENDED_SECTION) +
2797 number_of_entries(CODE_PTR, EXTENDED_SECTION) +
2798 number_of_entries(HEAP_PTR, EXTENDED_SECTION) +
2799 number_of_entries(INT32, EXTENDED_SECTION);
2800 }
2801 return length;
2802 }
2803
2804
2805 WriteBarrierMode HeapObject::GetWriteBarrierMode( 2421 WriteBarrierMode HeapObject::GetWriteBarrierMode(
2806 const DisallowHeapAllocation& promise) { 2422 const DisallowHeapAllocation& promise) {
2807 Heap* heap = GetHeap(); 2423 Heap* heap = GetHeap();
2808 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; 2424 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
2809 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; 2425 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
2810 return UPDATE_WRITE_BARRIER; 2426 return UPDATE_WRITE_BARRIER;
2811 } 2427 }
2812 2428
2813 2429
2814 bool HeapObject::NeedsToEnsureDoubleAlignment() { 2430 bool HeapObject::NeedsToEnsureDoubleAlignment() {
2815 #ifndef V8_HOST_ARCH_64_BIT 2431 #ifndef V8_HOST_ARCH_64_BIT
2816 return (IsFixedFloat64Array() || IsFixedDoubleArray() || 2432 return (IsFixedFloat64Array() || IsFixedDoubleArray()) &&
2817 IsConstantPoolArray()) &&
2818 FixedArrayBase::cast(this)->length() != 0; 2433 FixedArrayBase::cast(this)->length() != 0;
2819 #else 2434 #else
2820 return false; 2435 return false;
2821 #endif // V8_HOST_ARCH_64_BIT 2436 #endif // V8_HOST_ARCH_64_BIT
2822 } 2437 }
2823 2438
2824 2439
2825 void FixedArray::set(int index, 2440 void FixedArray::set(int index,
2826 Object* value, 2441 Object* value,
2827 WriteBarrierMode mode) { 2442 WriteBarrierMode mode) {
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after
3323 2938
3324 2939
3325 CAST_ACCESSOR(AccessorInfo) 2940 CAST_ACCESSOR(AccessorInfo)
3326 CAST_ACCESSOR(ArrayList) 2941 CAST_ACCESSOR(ArrayList)
3327 CAST_ACCESSOR(ByteArray) 2942 CAST_ACCESSOR(ByteArray)
3328 CAST_ACCESSOR(Cell) 2943 CAST_ACCESSOR(Cell)
3329 CAST_ACCESSOR(Code) 2944 CAST_ACCESSOR(Code)
3330 CAST_ACCESSOR(CodeCacheHashTable) 2945 CAST_ACCESSOR(CodeCacheHashTable)
3331 CAST_ACCESSOR(CompilationCacheTable) 2946 CAST_ACCESSOR(CompilationCacheTable)
3332 CAST_ACCESSOR(ConsString) 2947 CAST_ACCESSOR(ConsString)
3333 CAST_ACCESSOR(ConstantPoolArray)
3334 CAST_ACCESSOR(DeoptimizationInputData) 2948 CAST_ACCESSOR(DeoptimizationInputData)
3335 CAST_ACCESSOR(DeoptimizationOutputData) 2949 CAST_ACCESSOR(DeoptimizationOutputData)
3336 CAST_ACCESSOR(DependentCode) 2950 CAST_ACCESSOR(DependentCode)
3337 CAST_ACCESSOR(DescriptorArray) 2951 CAST_ACCESSOR(DescriptorArray)
3338 CAST_ACCESSOR(ExternalArray) 2952 CAST_ACCESSOR(ExternalArray)
3339 CAST_ACCESSOR(ExternalOneByteString) 2953 CAST_ACCESSOR(ExternalOneByteString)
3340 CAST_ACCESSOR(ExternalFloat32Array) 2954 CAST_ACCESSOR(ExternalFloat32Array)
3341 CAST_ACCESSOR(ExternalFloat64Array) 2955 CAST_ACCESSOR(ExternalFloat64Array)
3342 CAST_ACCESSOR(ExternalInt16Array) 2956 CAST_ACCESSOR(ExternalInt16Array)
3343 CAST_ACCESSOR(ExternalInt32Array) 2957 CAST_ACCESSOR(ExternalInt32Array)
(...skipping 1167 matching lines...) Expand 10 before | Expand all | Expand 10 after
4511 instance_type == INTERNALIZED_STRING_TYPE) { 4125 instance_type == INTERNALIZED_STRING_TYPE) {
4512 // Strings may get concurrently truncated, hence we have to access its 4126 // Strings may get concurrently truncated, hence we have to access its
4513 // length synchronized. 4127 // length synchronized.
4514 return SeqTwoByteString::SizeFor( 4128 return SeqTwoByteString::SizeFor(
4515 reinterpret_cast<SeqTwoByteString*>(this)->synchronized_length()); 4129 reinterpret_cast<SeqTwoByteString*>(this)->synchronized_length());
4516 } 4130 }
4517 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) { 4131 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
4518 return FixedDoubleArray::SizeFor( 4132 return FixedDoubleArray::SizeFor(
4519 reinterpret_cast<FixedDoubleArray*>(this)->length()); 4133 reinterpret_cast<FixedDoubleArray*>(this)->length());
4520 } 4134 }
4521 if (instance_type == CONSTANT_POOL_ARRAY_TYPE) {
4522 return reinterpret_cast<ConstantPoolArray*>(this)->size();
4523 }
4524 if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE && 4135 if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
4525 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) { 4136 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) {
4526 return reinterpret_cast<FixedTypedArrayBase*>( 4137 return reinterpret_cast<FixedTypedArrayBase*>(
4527 this)->TypedArraySize(instance_type); 4138 this)->TypedArraySize(instance_type);
4528 } 4139 }
4529 DCHECK(instance_type == CODE_TYPE); 4140 DCHECK(instance_type == CODE_TYPE);
4530 return reinterpret_cast<Code*>(this)->CodeSize(); 4141 return reinterpret_cast<Code*>(this)->CodeSize();
4531 } 4142 }
4532 4143
4533 4144
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
5118 bool Code::is_keyed_stub() { 4729 bool Code::is_keyed_stub() {
5119 return is_keyed_load_stub() || is_keyed_store_stub(); 4730 return is_keyed_load_stub() || is_keyed_store_stub();
5120 } 4731 }
5121 4732
5122 4733
5123 bool Code::is_debug_stub() { 4734 bool Code::is_debug_stub() {
5124 return ic_state() == DEBUG_STUB; 4735 return ic_state() == DEBUG_STUB;
5125 } 4736 }
5126 4737
5127 4738
5128 ConstantPoolArray* Code::constant_pool() { 4739 Address Code::constant_pool() {
5129 return ConstantPoolArray::cast(READ_FIELD(this, kConstantPoolOffset)); 4740 Address constant_pool = NULL;
4741 if (FLAG_enable_embedded_constant_pool) {
4742 int offset = constant_pool_offset();
4743 if (offset < instruction_size()) {
4744 constant_pool = FIELD_ADDR(this, kHeaderSize + offset);
4745 }
4746 }
4747 return constant_pool;
5130 } 4748 }
5131 4749
5132 4750
5133 void Code::set_constant_pool(Object* value) {
5134 DCHECK(value->IsConstantPoolArray());
5135 WRITE_FIELD(this, kConstantPoolOffset, value);
5136 WRITE_BARRIER(GetHeap(), this, kConstantPoolOffset, value);
5137 }
5138
5139
5140 Code::Flags Code::ComputeFlags(Kind kind, InlineCacheState ic_state, 4751 Code::Flags Code::ComputeFlags(Kind kind, InlineCacheState ic_state,
5141 ExtraICState extra_ic_state, StubType type, 4752 ExtraICState extra_ic_state, StubType type,
5142 CacheHolderFlag holder) { 4753 CacheHolderFlag holder) {
5143 // Compute the bit mask. 4754 // Compute the bit mask.
5144 unsigned int bits = KindField::encode(kind) 4755 unsigned int bits = KindField::encode(kind)
5145 | ICStateField::encode(ic_state) 4756 | ICStateField::encode(ic_state)
5146 | TypeField::encode(type) 4757 | TypeField::encode(type)
5147 | ExtraICStateField::encode(extra_ic_state) 4758 | ExtraICStateField::encode(extra_ic_state)
5148 | CacheHolderField::encode(holder); 4759 | CacheHolderField::encode(holder);
5149 return static_cast<Flags>(bits); 4760 return static_cast<Flags>(bits);
(...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after
6308 ACCESSORS(JSMessageObject, type, String, kTypeOffset) 5919 ACCESSORS(JSMessageObject, type, String, kTypeOffset)
6309 ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset) 5920 ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
6310 ACCESSORS(JSMessageObject, script, Object, kScriptOffset) 5921 ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
6311 ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset) 5922 ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
6312 SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset) 5923 SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
6313 SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset) 5924 SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
6314 5925
6315 5926
6316 INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset) 5927 INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
6317 INT_ACCESSORS(Code, prologue_offset, kPrologueOffset) 5928 INT_ACCESSORS(Code, prologue_offset, kPrologueOffset)
5929 INT_ACCESSORS(Code, constant_pool_offset, kConstantPoolOffset)
6318 ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset) 5930 ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
6319 ACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset) 5931 ACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset)
6320 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset) 5932 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
6321 ACCESSORS(Code, raw_type_feedback_info, Object, kTypeFeedbackInfoOffset) 5933 ACCESSORS(Code, raw_type_feedback_info, Object, kTypeFeedbackInfoOffset)
6322 ACCESSORS(Code, next_code_link, Object, kNextCodeLinkOffset) 5934 ACCESSORS(Code, next_code_link, Object, kNextCodeLinkOffset)
6323 5935
6324 5936
6325 void Code::WipeOutHeader() { 5937 void Code::WipeOutHeader() {
6326 WRITE_FIELD(this, kRelocationInfoOffset, NULL); 5938 WRITE_FIELD(this, kRelocationInfoOffset, NULL);
6327 WRITE_FIELD(this, kHandlerTableOffset, NULL); 5939 WRITE_FIELD(this, kHandlerTableOffset, NULL);
6328 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL); 5940 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL);
6329 WRITE_FIELD(this, kConstantPoolOffset, NULL);
6330 // Do not wipe out major/minor keys on a code stub or IC 5941 // Do not wipe out major/minor keys on a code stub or IC
6331 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) { 5942 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) {
6332 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL); 5943 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL);
6333 } 5944 }
6334 } 5945 }
6335 5946
6336 5947
6337 Object* Code::type_feedback_info() { 5948 Object* Code::type_feedback_info() {
6338 DCHECK(kind() == FUNCTION); 5949 DCHECK(kind() == FUNCTION);
6339 return raw_type_feedback_info(); 5950 return raw_type_feedback_info();
(...skipping 1259 matching lines...) Expand 10 before | Expand all | Expand 10 after
7599 #undef READ_SHORT_FIELD 7210 #undef READ_SHORT_FIELD
7600 #undef WRITE_SHORT_FIELD 7211 #undef WRITE_SHORT_FIELD
7601 #undef READ_BYTE_FIELD 7212 #undef READ_BYTE_FIELD
7602 #undef WRITE_BYTE_FIELD 7213 #undef WRITE_BYTE_FIELD
7603 #undef NOBARRIER_READ_BYTE_FIELD 7214 #undef NOBARRIER_READ_BYTE_FIELD
7604 #undef NOBARRIER_WRITE_BYTE_FIELD 7215 #undef NOBARRIER_WRITE_BYTE_FIELD
7605 7216
7606 } } // namespace v8::internal 7217 } } // namespace v8::internal
7607 7218
7608 #endif // V8_OBJECTS_INL_H_ 7219 #endif // V8_OBJECTS_INL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698