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

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

Issue 1155703006: Revert of Embedded constant pools. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 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() || IsFixedTypedArrayBase() || 145 return IsFixedArray() || IsFixedDoubleArray() || IsConstantPoolArray() ||
146 IsExternalArray(); 146 IsFixedTypedArrayBase() || 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)
721 722
722 723
723 bool Object::IsJSWeakCollection() const { 724 bool Object::IsJSWeakCollection() const {
724 return IsJSWeakMap() || IsJSWeakSet(); 725 return IsJSWeakMap() || IsJSWeakSet();
725 } 726 }
726 727
727 728
728 bool Object::IsDescriptorArray() const { 729 bool Object::IsDescriptorArray() const {
729 return IsFixedArray(); 730 return IsFixedArray();
730 } 731 }
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 if (type == SYMBOL_TYPE) { 1529 if (type == SYMBOL_TYPE) {
1529 return false; 1530 return false;
1530 } 1531 }
1531 DCHECK(type < FIRST_NONSTRING_TYPE); 1532 DCHECK(type < FIRST_NONSTRING_TYPE);
1532 // There are four string representations: sequential strings, external 1533 // There are four string representations: sequential strings, external
1533 // strings, cons strings, and sliced strings. 1534 // strings, cons strings, and sliced strings.
1534 // Only the former two contain raw values and no heap pointers (besides the 1535 // Only the former two contain raw values and no heap pointers (besides the
1535 // map-word). 1536 // map-word).
1536 return ((type & kIsIndirectStringMask) != kIsIndirectStringTag); 1537 return ((type & kIsIndirectStringMask) != kIsIndirectStringTag);
1537 } 1538 }
1539 // The ConstantPoolArray contains heap pointers, but also raw values.
1540 if (type == CONSTANT_POOL_ARRAY_TYPE) return true;
1538 return (type <= LAST_DATA_TYPE); 1541 return (type <= LAST_DATA_TYPE);
1539 } 1542 }
1540 1543
1541 1544
1542 void HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) { 1545 void HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) {
1543 v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)), 1546 v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)),
1544 reinterpret_cast<Object**>(FIELD_ADDR(this, end))); 1547 reinterpret_cast<Object**>(FIELD_ADDR(this, end)));
1545 } 1548 }
1546 1549
1547 1550
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after
2410 } 2413 }
2411 2414
2412 2415
2413 void ArrayList::Clear(int index, Object* undefined) { 2416 void ArrayList::Clear(int index, Object* undefined) {
2414 DCHECK(undefined->IsUndefined()); 2417 DCHECK(undefined->IsUndefined());
2415 FixedArray::cast(this) 2418 FixedArray::cast(this)
2416 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER); 2419 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER);
2417 } 2420 }
2418 2421
2419 2422
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
2420 WriteBarrierMode HeapObject::GetWriteBarrierMode( 2804 WriteBarrierMode HeapObject::GetWriteBarrierMode(
2421 const DisallowHeapAllocation& promise) { 2805 const DisallowHeapAllocation& promise) {
2422 Heap* heap = GetHeap(); 2806 Heap* heap = GetHeap();
2423 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; 2807 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
2424 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; 2808 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
2425 return UPDATE_WRITE_BARRIER; 2809 return UPDATE_WRITE_BARRIER;
2426 } 2810 }
2427 2811
2428 2812
2429 AllocationAlignment HeapObject::RequiredAlignment() { 2813 AllocationAlignment HeapObject::RequiredAlignment() {
2430 #ifdef V8_HOST_ARCH_32_BIT 2814 #ifdef V8_HOST_ARCH_32_BIT
2431 if ((IsFixedFloat64Array() || IsFixedDoubleArray()) && 2815 if ((IsFixedFloat64Array() || IsFixedDoubleArray() ||
2816 IsConstantPoolArray()) &&
2432 FixedArrayBase::cast(this)->length() != 0) { 2817 FixedArrayBase::cast(this)->length() != 0) {
2433 return kDoubleAligned; 2818 return kDoubleAligned;
2434 } 2819 }
2435 if (IsHeapNumber()) return kDoubleUnaligned; 2820 if (IsHeapNumber()) return kDoubleUnaligned;
2436 #endif // V8_HOST_ARCH_32_BIT 2821 #endif // V8_HOST_ARCH_32_BIT
2437 return kWordAligned; 2822 return kWordAligned;
2438 } 2823 }
2439 2824
2440 2825
2441 void FixedArray::set(int index, 2826 void FixedArray::set(int index,
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
2945 3330
2946 3331
2947 CAST_ACCESSOR(AccessorInfo) 3332 CAST_ACCESSOR(AccessorInfo)
2948 CAST_ACCESSOR(ArrayList) 3333 CAST_ACCESSOR(ArrayList)
2949 CAST_ACCESSOR(ByteArray) 3334 CAST_ACCESSOR(ByteArray)
2950 CAST_ACCESSOR(Cell) 3335 CAST_ACCESSOR(Cell)
2951 CAST_ACCESSOR(Code) 3336 CAST_ACCESSOR(Code)
2952 CAST_ACCESSOR(CodeCacheHashTable) 3337 CAST_ACCESSOR(CodeCacheHashTable)
2953 CAST_ACCESSOR(CompilationCacheTable) 3338 CAST_ACCESSOR(CompilationCacheTable)
2954 CAST_ACCESSOR(ConsString) 3339 CAST_ACCESSOR(ConsString)
3340 CAST_ACCESSOR(ConstantPoolArray)
2955 CAST_ACCESSOR(DeoptimizationInputData) 3341 CAST_ACCESSOR(DeoptimizationInputData)
2956 CAST_ACCESSOR(DeoptimizationOutputData) 3342 CAST_ACCESSOR(DeoptimizationOutputData)
2957 CAST_ACCESSOR(DependentCode) 3343 CAST_ACCESSOR(DependentCode)
2958 CAST_ACCESSOR(DescriptorArray) 3344 CAST_ACCESSOR(DescriptorArray)
2959 CAST_ACCESSOR(ExternalArray) 3345 CAST_ACCESSOR(ExternalArray)
2960 CAST_ACCESSOR(ExternalOneByteString) 3346 CAST_ACCESSOR(ExternalOneByteString)
2961 CAST_ACCESSOR(ExternalFloat32Array) 3347 CAST_ACCESSOR(ExternalFloat32Array)
2962 CAST_ACCESSOR(ExternalFloat64Array) 3348 CAST_ACCESSOR(ExternalFloat64Array)
2963 CAST_ACCESSOR(ExternalInt16Array) 3349 CAST_ACCESSOR(ExternalInt16Array)
2964 CAST_ACCESSOR(ExternalInt32Array) 3350 CAST_ACCESSOR(ExternalInt32Array)
(...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after
4134 instance_type == INTERNALIZED_STRING_TYPE) { 4520 instance_type == INTERNALIZED_STRING_TYPE) {
4135 // Strings may get concurrently truncated, hence we have to access its 4521 // Strings may get concurrently truncated, hence we have to access its
4136 // length synchronized. 4522 // length synchronized.
4137 return SeqTwoByteString::SizeFor( 4523 return SeqTwoByteString::SizeFor(
4138 reinterpret_cast<SeqTwoByteString*>(this)->synchronized_length()); 4524 reinterpret_cast<SeqTwoByteString*>(this)->synchronized_length());
4139 } 4525 }
4140 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) { 4526 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
4141 return FixedDoubleArray::SizeFor( 4527 return FixedDoubleArray::SizeFor(
4142 reinterpret_cast<FixedDoubleArray*>(this)->length()); 4528 reinterpret_cast<FixedDoubleArray*>(this)->length());
4143 } 4529 }
4530 if (instance_type == CONSTANT_POOL_ARRAY_TYPE) {
4531 return reinterpret_cast<ConstantPoolArray*>(this)->size();
4532 }
4144 if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE && 4533 if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
4145 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) { 4534 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) {
4146 return reinterpret_cast<FixedTypedArrayBase*>( 4535 return reinterpret_cast<FixedTypedArrayBase*>(
4147 this)->TypedArraySize(instance_type); 4536 this)->TypedArraySize(instance_type);
4148 } 4537 }
4149 DCHECK(instance_type == CODE_TYPE); 4538 DCHECK(instance_type == CODE_TYPE);
4150 return reinterpret_cast<Code*>(this)->CodeSize(); 4539 return reinterpret_cast<Code*>(this)->CodeSize();
4151 } 4540 }
4152 4541
4153 4542
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
4736 bool Code::is_keyed_stub() { 5125 bool Code::is_keyed_stub() {
4737 return is_keyed_load_stub() || is_keyed_store_stub(); 5126 return is_keyed_load_stub() || is_keyed_store_stub();
4738 } 5127 }
4739 5128
4740 5129
4741 bool Code::is_debug_stub() { 5130 bool Code::is_debug_stub() {
4742 return ic_state() == DEBUG_STUB; 5131 return ic_state() == DEBUG_STUB;
4743 } 5132 }
4744 5133
4745 5134
4746 Address Code::constant_pool() { 5135 ConstantPoolArray* Code::constant_pool() {
4747 Address constant_pool = NULL; 5136 return ConstantPoolArray::cast(READ_FIELD(this, kConstantPoolOffset));
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;
4755 } 5137 }
4756 5138
4757 5139
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
4758 Code::Flags Code::ComputeFlags(Kind kind, InlineCacheState ic_state, 5147 Code::Flags Code::ComputeFlags(Kind kind, InlineCacheState ic_state,
4759 ExtraICState extra_ic_state, StubType type, 5148 ExtraICState extra_ic_state, StubType type,
4760 CacheHolderFlag holder) { 5149 CacheHolderFlag holder) {
4761 // Compute the bit mask. 5150 // Compute the bit mask.
4762 unsigned int bits = KindField::encode(kind) 5151 unsigned int bits = KindField::encode(kind)
4763 | ICStateField::encode(ic_state) 5152 | ICStateField::encode(ic_state)
4764 | TypeField::encode(type) 5153 | TypeField::encode(type)
4765 | ExtraICStateField::encode(extra_ic_state) 5154 | ExtraICStateField::encode(extra_ic_state)
4766 | CacheHolderField::encode(holder); 5155 | CacheHolderField::encode(holder);
4767 return static_cast<Flags>(bits); 5156 return static_cast<Flags>(bits);
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after
5922 SMI_ACCESSORS(JSMessageObject, type, kTypeOffset) 6311 SMI_ACCESSORS(JSMessageObject, type, kTypeOffset)
5923 ACCESSORS(JSMessageObject, argument, Object, kArgumentsOffset) 6312 ACCESSORS(JSMessageObject, argument, Object, kArgumentsOffset)
5924 ACCESSORS(JSMessageObject, script, Object, kScriptOffset) 6313 ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
5925 ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset) 6314 ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
5926 SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset) 6315 SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
5927 SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset) 6316 SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
5928 6317
5929 6318
5930 INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset) 6319 INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
5931 INT_ACCESSORS(Code, prologue_offset, kPrologueOffset) 6320 INT_ACCESSORS(Code, prologue_offset, kPrologueOffset)
5932 INT_ACCESSORS(Code, constant_pool_offset, kConstantPoolOffset)
5933 ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset) 6321 ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
5934 ACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset) 6322 ACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset)
5935 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset) 6323 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
5936 ACCESSORS(Code, raw_type_feedback_info, Object, kTypeFeedbackInfoOffset) 6324 ACCESSORS(Code, raw_type_feedback_info, Object, kTypeFeedbackInfoOffset)
5937 ACCESSORS(Code, next_code_link, Object, kNextCodeLinkOffset) 6325 ACCESSORS(Code, next_code_link, Object, kNextCodeLinkOffset)
5938 6326
5939 6327
5940 void Code::WipeOutHeader() { 6328 void Code::WipeOutHeader() {
5941 WRITE_FIELD(this, kRelocationInfoOffset, NULL); 6329 WRITE_FIELD(this, kRelocationInfoOffset, NULL);
5942 WRITE_FIELD(this, kHandlerTableOffset, NULL); 6330 WRITE_FIELD(this, kHandlerTableOffset, NULL);
5943 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL); 6331 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL);
6332 WRITE_FIELD(this, kConstantPoolOffset, NULL);
5944 // Do not wipe out major/minor keys on a code stub or IC 6333 // Do not wipe out major/minor keys on a code stub or IC
5945 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) { 6334 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) {
5946 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL); 6335 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL);
5947 } 6336 }
5948 } 6337 }
5949 6338
5950 6339
5951 Object* Code::type_feedback_info() { 6340 Object* Code::type_feedback_info() {
5952 DCHECK(kind() == FUNCTION); 6341 DCHECK(kind() == FUNCTION);
5953 return raw_type_feedback_info(); 6342 return raw_type_feedback_info();
(...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after
7326 #undef READ_SHORT_FIELD 7715 #undef READ_SHORT_FIELD
7327 #undef WRITE_SHORT_FIELD 7716 #undef WRITE_SHORT_FIELD
7328 #undef READ_BYTE_FIELD 7717 #undef READ_BYTE_FIELD
7329 #undef WRITE_BYTE_FIELD 7718 #undef WRITE_BYTE_FIELD
7330 #undef NOBARRIER_READ_BYTE_FIELD 7719 #undef NOBARRIER_READ_BYTE_FIELD
7331 #undef NOBARRIER_WRITE_BYTE_FIELD 7720 #undef NOBARRIER_WRITE_BYTE_FIELD
7332 7721
7333 } } // namespace v8::internal 7722 } } // namespace v8::internal
7334 7723
7335 #endif // V8_OBJECTS_INL_H_ 7724 #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