Chromium Code Reviews| Index: src/objects-inl.h |
| diff --git a/src/objects-inl.h b/src/objects-inl.h |
| index 8c20c7a1663a1af4096a23f818fe37d1eb0a5fac..2de7b957373034fb9caa7cf5e063583d039ca242 100644 |
| --- a/src/objects-inl.h |
| +++ b/src/objects-inl.h |
| @@ -133,7 +133,7 @@ PropertyDetails PropertyDetails::AsDeleted() { |
| bool Object::IsFixedArrayBase() { |
| - return IsFixedArray() || IsFixedDoubleArray(); |
| + return IsFixedArray() || IsFixedDoubleArray() || IsConstantPoolArray(); |
| } |
| @@ -571,6 +571,7 @@ TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) |
| TYPE_CHECKER(Map, MAP_TYPE) |
| TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE) |
| TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) |
| +TYPE_CHECKER(ConstantPoolArray, CONSTANT_POOL_ARRAY_TYPE) |
| bool Object::IsJSWeakCollection() { |
| @@ -1027,6 +1028,12 @@ MaybeObject* Object::GetProperty(Name* key, PropertyAttributes* attributes) { |
| #define WRITE_UINT32_FIELD(p, offset, value) \ |
| (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value) |
| +#define READ_INT32_FIELD(p, offset) \ |
| + (*reinterpret_cast<int32_t*>(FIELD_ADDR(p, offset))) |
| + |
| +#define WRITE_INT32_FIELD(p, offset, value) \ |
| + (*reinterpret_cast<int32_t*>(FIELD_ADDR(p, offset)) = value) |
| + |
| #define READ_INT64_FIELD(p, offset) \ |
| (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset))) |
| @@ -1894,7 +1901,8 @@ void Object::VerifyApiCallResultType() { |
| FixedArrayBase* FixedArrayBase::cast(Object* object) { |
| - ASSERT(object->IsFixedArray() || object->IsFixedDoubleArray()); |
| + ASSERT(object->IsFixedArray() || object->IsFixedDoubleArray() || |
| + object->IsConstantPoolArray()); |
| return reinterpret_cast<FixedArrayBase*>(object); |
| } |
| @@ -1993,6 +2001,109 @@ bool FixedDoubleArray::is_the_hole(int index) { |
| } |
| +SMI_ACCESSORS(ConstantPoolArray, first_ptr_index, kFirstPointerIndexOffset) |
| +SMI_ACCESSORS(ConstantPoolArray, first_int32_index, kFirstInt32IndexOffset) |
| + |
| + |
| +int ConstantPoolArray::first_int64_index() { |
| + return 0; |
| +} |
| + |
| + |
| +int ConstantPoolArray::count_of_int64_entries() { |
| + return first_ptr_index(); |
| +} |
| + |
| + |
| +int ConstantPoolArray::count_of_ptr_entries() { |
| + return first_int32_index() - first_ptr_index(); |
| +} |
| + |
| + |
| +int ConstantPoolArray::count_of_int32_entries() { |
| + return length() - first_int32_index(); |
| +} |
| + |
| + |
| +void ConstantPoolArray::SetEntryCounts(int number_of_int64_entries, |
| + int number_of_ptr_entries, |
| + int number_of_int32_entries) { |
| + set_first_ptr_index(number_of_int64_entries); |
| + set_first_int32_index(number_of_int64_entries + number_of_ptr_entries); |
| + set_length(number_of_int64_entries + number_of_ptr_entries + |
| + number_of_int32_entries); |
| +} |
| + |
| + |
| +int64_t ConstantPoolArray::get_int64_entry(int index) { |
| + ASSERT(map() == GetHeap()->constant_pool_array_map()); |
| + ASSERT(index >= 0 && index < first_ptr_index()); |
| + 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_ptr_index()); |
| + return READ_DOUBLE_FIELD(this, OffsetOfElementAt(index)); |
| +} |
| + |
| + |
| +Object* ConstantPoolArray::get_ptr_entry(int index) { |
| + ASSERT(map() == GetHeap()->constant_pool_array_map()); |
| + ASSERT(index >= first_ptr_index() && index < first_int32_index()); |
| + 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()); |
| + return READ_INT32_FIELD(this, OffsetOfElementAt(index)); |
| +} |
| + |
| + |
| +MaybeObject* ConstantPoolArray::get(int index) { |
|
ulan
2013/09/27 12:39:10
Let's either call this function Get to indicate th
rmcilroy
2013/10/01 11:21:52
Removed the function instead.
|
| + if (index < first_ptr_index()) { |
| + return GetHeap()->NumberFromDouble(get_int64_entry_as_double(index)); |
| + } else if (index < first_int32_index()) { |
| + return get_ptr_entry(index); |
| + } else { |
| + return GetHeap()->NumberFromInt32(get_int32_entry(index)); |
| + } |
| +} |
| + |
| + |
| +void ConstantPoolArray::set(int index, Object* value) { |
| + ASSERT(map() == GetHeap()->constant_pool_array_map()); |
| + ASSERT(index >= first_ptr_index() && index < first_int32_index()); |
| + WRITE_FIELD(this, OffsetOfElementAt(index), value); |
| + WRITE_BARRIER(GetHeap(), this, OffsetOfElementAt(index), value); |
| +} |
| + |
| + |
| +void ConstantPoolArray::set(int index, int64_t value) { |
| + ASSERT(map() == GetHeap()->constant_pool_array_map()); |
| + ASSERT(index >= first_int64_index() && index < first_ptr_index()); |
| + 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(index >= first_int64_index() && index < first_ptr_index()); |
| + WRITE_DOUBLE_FIELD(this, OffsetOfElementAt(index), value); |
| +} |
| + |
| + |
| +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); |
| +} |
| + |
| + |
| WriteBarrierMode HeapObject::GetWriteBarrierMode( |
| const DisallowHeapAllocation& promise) { |
| Heap* heap = GetHeap(); |
| @@ -2485,6 +2596,7 @@ void SeededNumberDictionary::set_requires_slow_elements() { |
| CAST_ACCESSOR(FixedArray) |
| CAST_ACCESSOR(FixedDoubleArray) |
| +CAST_ACCESSOR(ConstantPoolArray) |
| CAST_ACCESSOR(DescriptorArray) |
| CAST_ACCESSOR(DeoptimizationInputData) |
| CAST_ACCESSOR(DeoptimizationOutputData) |
| @@ -3380,6 +3492,12 @@ int HeapObject::SizeFromMap(Map* map) { |
| return FixedDoubleArray::SizeFor( |
| 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_ptr_entries(), |
| + reinterpret_cast<ConstantPoolArray*>(this)->count_of_int32_entries()); |
| + } |
| ASSERT(instance_type == CODE_TYPE); |
| return reinterpret_cast<Code*>(this)->CodeSize(); |
| } |
| @@ -6022,6 +6140,12 @@ MaybeObject* FixedDoubleArray::Copy() { |
| } |
| +MaybeObject* ConstantPoolArray::Copy() { |
| + if (length() == 0) return this; |
| + return GetHeap()->CopyConstantPoolArray(this); |
| +} |
| + |
| + |
| void TypeFeedbackCells::SetAstId(int index, TypeFeedbackId id) { |
| set(1 + index * 2, Smi::FromInt(id.ToInt())); |
| } |