OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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_ |
OLD | NEW |