Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index 872fa1c0265a46d6e30059205f224234d0a5c3fe..36d1aa1d84eeb91cb133d63eab5e4959e7e74187 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -2217,152 +2217,281 @@ void FixedDoubleArray::FillWithHoles(int from, int to) { |
} |
-void ConstantPoolArray::set_weak_object_state( |
- ConstantPoolArray::WeakObjectState state) { |
- int old_layout_field = READ_INT_FIELD(this, kArrayLayoutOffset); |
- int new_layout_field = WeakObjectStateField::update(old_layout_field, state); |
- WRITE_INT_FIELD(this, kArrayLayoutOffset, new_layout_field); |
+bool ConstantPoolArray::is_extended_layout() { |
+ uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset); |
+ return IsExtendedField::decode(small_layout_1); |
} |
-ConstantPoolArray::WeakObjectState ConstantPoolArray::get_weak_object_state() { |
- int layout_field = READ_INT_FIELD(this, kArrayLayoutOffset); |
- return WeakObjectStateField::decode(layout_field); |
+ConstantPoolArray::LayoutSection ConstantPoolArray::final_section() { |
+ return is_extended_layout() ? EXTENDED_SECTION : SMALL_SECTION; |
} |
-int ConstantPoolArray::first_int64_index() { |
- return 0; |
+int ConstantPoolArray::first_extended_section_index() { |
+ ASSERT(is_extended_layout()); |
+ uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset); |
+ return TotalCountField::decode(small_layout_2); |
} |
-int ConstantPoolArray::first_code_ptr_index() { |
- int layout_field = READ_INT_FIELD(this, kArrayLayoutOffset); |
- return first_int64_index() + |
- NumberOfInt64EntriesField::decode(layout_field); |
+int ConstantPoolArray::get_extended_section_header_offset() { |
+ return RoundUp(SizeFor(NumberOfEntries(this, SMALL_SECTION)), kInt64Size); |
} |
-int ConstantPoolArray::first_heap_ptr_index() { |
- int layout_field = READ_INT_FIELD(this, kArrayLayoutOffset); |
- return first_code_ptr_index() + |
- NumberOfCodePtrEntriesField::decode(layout_field); |
+ConstantPoolArray::WeakObjectState ConstantPoolArray::get_weak_object_state() { |
+ uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset); |
+ return WeakObjectStateField::decode(small_layout_2); |
} |
-int ConstantPoolArray::first_int32_index() { |
- int layout_field = READ_INT_FIELD(this, kArrayLayoutOffset); |
- return first_heap_ptr_index() + |
- NumberOfHeapPtrEntriesField::decode(layout_field); |
+void ConstantPoolArray::set_weak_object_state( |
+ ConstantPoolArray::WeakObjectState state) { |
+ uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset); |
+ small_layout_2 = WeakObjectStateField::update(small_layout_2, state); |
+ WRITE_INT32_FIELD(this, kSmallLayout2Offset, small_layout_2); |
} |
-int ConstantPoolArray::count_of_int64_entries() { |
- return first_code_ptr_index(); |
-} |
+int ConstantPoolArray::first_index(Type type, LayoutSection section) { |
+ int index = 0; |
+ if (section == EXTENDED_SECTION) { |
+ ASSERT(is_extended_layout()); |
+ index += first_extended_section_index(); |
+ } |
+ for (Type type_iter = FIRST_TYPE; type_iter < type; |
+ type_iter = next_type(type_iter)) { |
+ index += number_of_entries(type_iter, section); |
+ } |
-int ConstantPoolArray::count_of_code_ptr_entries() { |
- return first_heap_ptr_index() - first_code_ptr_index(); |
+ return index; |
} |
-int ConstantPoolArray::count_of_heap_ptr_entries() { |
- return first_int32_index() - first_heap_ptr_index(); |
+int ConstantPoolArray::last_index(Type type, LayoutSection section) { |
+ return first_index(type, section) + number_of_entries(type, section) - 1; |
} |
-int ConstantPoolArray::count_of_int32_entries() { |
- return length() - first_int32_index(); |
+int ConstantPoolArray::number_of_entries(Type type, LayoutSection section) { |
+ if (section == SMALL_SECTION) { |
+ uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset); |
+ uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset); |
+ switch (type) { |
+ case INT64: |
+ return Int64CountField::decode(small_layout_1); |
+ case CODE_PTR: |
+ return CodePtrCountField::decode(small_layout_1); |
+ case HEAP_PTR: |
+ return HeapPtrCountField::decode(small_layout_1); |
+ case INT32: |
+ return Int32CountField::decode(small_layout_2); |
+ default: |
+ UNREACHABLE(); |
+ return 0; |
+ } |
+ } else { |
+ ASSERT(section == EXTENDED_SECTION && is_extended_layout()); |
+ int offset = get_extended_section_header_offset(); |
+ switch (type) { |
+ case INT64: |
+ offset += kExtendedInt64CountOffset; |
+ break; |
+ case CODE_PTR: |
+ offset += kExtendedCodePtrCountOffset; |
+ break; |
+ case HEAP_PTR: |
+ offset += kExtendedHeapPtrCountOffset; |
+ break; |
+ case INT32: |
+ offset += kExtendedInt32CountOffset; |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ return READ_INT_FIELD(this, offset); |
+ } |
} |
-void ConstantPoolArray::Init(int number_of_int64_entries, |
- int number_of_code_ptr_entries, |
- int number_of_heap_ptr_entries, |
- int number_of_int32_entries) { |
- set_length(number_of_int64_entries + |
- number_of_code_ptr_entries + |
- number_of_heap_ptr_entries + |
- number_of_int32_entries); |
- int layout_field = |
- NumberOfInt64EntriesField::encode(number_of_int64_entries) | |
- NumberOfCodePtrEntriesField::encode(number_of_code_ptr_entries) | |
- NumberOfHeapPtrEntriesField::encode(number_of_heap_ptr_entries) | |
- WeakObjectStateField::encode(NO_WEAK_OBJECTS); |
- WRITE_INT_FIELD(this, kArrayLayoutOffset, layout_field); |
+ConstantPoolArray::Type ConstantPoolArray::get_type(int index) { |
+ LayoutSection section; |
+ if (is_extended_layout() && index >= first_extended_section_index()) { |
+ section = EXTENDED_SECTION; |
+ } else { |
+ section = SMALL_SECTION; |
+ } |
+ |
+ Type type = FIRST_TYPE; |
+ while (index > last_index(type, section)) { |
+ type = next_type(type); |
+ } |
+ ASSERT(type <= LAST_TYPE); |
+ return type; |
} |
int64_t ConstantPoolArray::get_int64_entry(int index) { |
ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= 0 && index < first_code_ptr_index()); |
+ ASSERT(get_type(index) == INT64); |
return READ_INT64_FIELD(this, OffsetOfElementAt(index)); |
} |
+ |
double ConstantPoolArray::get_int64_entry_as_double(int index) { |
STATIC_ASSERT(kDoubleSize == kInt64Size); |
ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= 0 && index < first_code_ptr_index()); |
+ ASSERT(get_type(index) == INT64); |
return READ_DOUBLE_FIELD(this, OffsetOfElementAt(index)); |
} |
Address ConstantPoolArray::get_code_ptr_entry(int index) { |
ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= first_code_ptr_index() && index < first_heap_ptr_index()); |
+ ASSERT(get_type(index) == CODE_PTR); |
return reinterpret_cast<Address>(READ_FIELD(this, OffsetOfElementAt(index))); |
} |
Object* ConstantPoolArray::get_heap_ptr_entry(int index) { |
ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= first_heap_ptr_index() && index < first_int32_index()); |
+ ASSERT(get_type(index) == HEAP_PTR); |
return READ_FIELD(this, OffsetOfElementAt(index)); |
} |
int32_t ConstantPoolArray::get_int32_entry(int index) { |
ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= first_int32_index() && index < length()); |
+ ASSERT(get_type(index) == INT32); |
return READ_INT32_FIELD(this, OffsetOfElementAt(index)); |
} |
+void ConstantPoolArray::set(int index, int64_t value) { |
+ ASSERT(map() == GetHeap()->constant_pool_array_map()); |
+ ASSERT(get_type(index) == INT64); |
+ WRITE_INT64_FIELD(this, OffsetOfElementAt(index), value); |
+} |
+ |
+ |
+void ConstantPoolArray::set(int index, double value) { |
+ STATIC_ASSERT(kDoubleSize == kInt64Size); |
+ ASSERT(map() == GetHeap()->constant_pool_array_map()); |
+ ASSERT(get_type(index) == INT64); |
+ WRITE_DOUBLE_FIELD(this, OffsetOfElementAt(index), value); |
+} |
+ |
+ |
void ConstantPoolArray::set(int index, Address value) { |
ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= first_code_ptr_index() && index < first_heap_ptr_index()); |
+ ASSERT(get_type(index) == CODE_PTR); |
WRITE_FIELD(this, OffsetOfElementAt(index), reinterpret_cast<Object*>(value)); |
} |
void ConstantPoolArray::set(int index, Object* value) { |
ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= first_code_ptr_index() && index < first_int32_index()); |
+ ASSERT(get_type(index) == HEAP_PTR); |
WRITE_FIELD(this, OffsetOfElementAt(index), value); |
WRITE_BARRIER(GetHeap(), this, OffsetOfElementAt(index), value); |
} |
-void ConstantPoolArray::set(int index, int64_t value) { |
+void ConstantPoolArray::set(int index, int32_t value) { |
ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= first_int64_index() && index < first_code_ptr_index()); |
- WRITE_INT64_FIELD(this, OffsetOfElementAt(index), value); |
+ ASSERT(get_type(index) == INT32); |
+ WRITE_INT32_FIELD(this, OffsetOfElementAt(index), value); |
} |
-void ConstantPoolArray::set(int index, double value) { |
- STATIC_ASSERT(kDoubleSize == kInt64Size); |
- ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= first_int64_index() && index < first_code_ptr_index()); |
- WRITE_DOUBLE_FIELD(this, OffsetOfElementAt(index), value); |
+void ConstantPoolArray::Init(const NumberOfEntries& small) { |
+ uint32_t small_layout_1 = |
+ Int64CountField::encode(small.count_of(INT64)) | |
+ CodePtrCountField::encode(small.count_of(CODE_PTR)) | |
+ HeapPtrCountField::encode(small.count_of(HEAP_PTR)) | |
+ IsExtendedField::encode(false); |
+ uint32_t small_layout_2 = |
+ Int32CountField::encode(small.count_of(INT32)) | |
+ TotalCountField::encode(small.total_count()) | |
+ WeakObjectStateField::encode(NO_WEAK_OBJECTS); |
+ WRITE_UINT32_FIELD(this, kSmallLayout1Offset, small_layout_1); |
+ WRITE_UINT32_FIELD(this, kSmallLayout2Offset, small_layout_2); |
+ if (kHeaderSize != kFirstEntryOffset) { |
+ ASSERT(kFirstEntryOffset - kHeaderSize == kInt32Size); |
+ WRITE_UINT32_FIELD(this, kHeaderSize, 0); // Zero out header padding. |
+ } |
} |
-void ConstantPoolArray::set(int index, int32_t value) { |
- ASSERT(map() == GetHeap()->constant_pool_array_map()); |
- ASSERT(index >= this->first_int32_index() && index < length()); |
- WRITE_INT32_FIELD(this, OffsetOfElementAt(index), value); |
+void ConstantPoolArray::InitExtended(const NumberOfEntries& small, |
+ const NumberOfEntries& extended) { |
+ // Initialize small layout fields first. |
+ Init(small); |
+ |
+ // Set is_extended_layout field. |
+ uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset); |
+ small_layout_1 = IsExtendedField::update(small_layout_1, true); |
+ WRITE_INT32_FIELD(this, kSmallLayout1Offset, small_layout_1); |
+ |
+ // Initialize the extended layout fields. |
+ int extended_header_offset = get_extended_section_header_offset(); |
+ WRITE_INT_FIELD(this, extended_header_offset + kExtendedInt64CountOffset, |
+ extended.count_of(INT64)); |
+ WRITE_INT_FIELD(this, extended_header_offset + kExtendedCodePtrCountOffset, |
+ extended.count_of(CODE_PTR)); |
+ WRITE_INT_FIELD(this, extended_header_offset + kExtendedHeapPtrCountOffset, |
+ extended.count_of(HEAP_PTR)); |
+ WRITE_INT_FIELD(this, extended_header_offset + kExtendedInt32CountOffset, |
+ extended.count_of(INT32)); |
+} |
+ |
+ |
+int ConstantPoolArray::size() { |
+ NumberOfEntries small(this, SMALL_SECTION); |
+ if (!is_extended_layout()) { |
+ return SizeFor(small); |
+ } else { |
+ NumberOfEntries extended(this, EXTENDED_SECTION); |
+ return SizeForExtended(small, extended); |
+ } |
+} |
+ |
+ |
+int ConstantPoolArray::length() { |
+ uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset); |
+ int length = TotalCountField::decode(small_layout_2); |
+ if (is_extended_layout()) { |
+ length += number_of_entries(INT64, EXTENDED_SECTION) + |
+ number_of_entries(CODE_PTR, EXTENDED_SECTION) + |
+ number_of_entries(HEAP_PTR, EXTENDED_SECTION) + |
+ number_of_entries(INT32, EXTENDED_SECTION); |
+ } |
+ return length; |
+} |
+ |
+ |
+int ConstantPoolArray::Iterator::next_index() { |
+ ASSERT(!is_finished()); |
+ int ret = next_index_++; |
+ update_section(); |
+ return ret; |
+} |
+ |
+ |
+bool ConstantPoolArray::Iterator::is_finished() { |
+ return next_index_ > array_->last_index(type_, final_section_); |
+} |
+ |
+ |
+void ConstantPoolArray::Iterator::update_section() { |
+ if (next_index_ > array_->last_index(type_, current_section_) && |
+ current_section_ != final_section_) { |
+ ASSERT(final_section_ == EXTENDED_SECTION); |
+ current_section_ = EXTENDED_SECTION; |
+ next_index_ = array_->first_index(type_, EXTENDED_SECTION); |
+ } |
} |
@@ -3977,11 +4106,7 @@ int HeapObject::SizeFromMap(Map* map) { |
reinterpret_cast<FixedDoubleArray*>(this)->length()); |
} |
if (instance_type == CONSTANT_POOL_ARRAY_TYPE) { |
- return ConstantPoolArray::SizeFor( |
- reinterpret_cast<ConstantPoolArray*>(this)->count_of_int64_entries(), |
- reinterpret_cast<ConstantPoolArray*>(this)->count_of_code_ptr_entries(), |
- reinterpret_cast<ConstantPoolArray*>(this)->count_of_heap_ptr_entries(), |
- reinterpret_cast<ConstantPoolArray*>(this)->count_of_int32_entries()); |
+ return reinterpret_cast<ConstantPoolArray*>(this)->size(); |
} |
if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE && |
instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) { |