Chromium Code Reviews| Index: src/objects-inl.h |
| diff --git a/src/objects-inl.h b/src/objects-inl.h |
| index b2603a2b12fa0da8ce9e25060b1b8f49eb27b2ae..361dafa609a8bd446a6e70cc28987d805f816c1d 100644 |
| --- a/src/objects-inl.h |
| +++ b/src/objects-inl.h |
| @@ -1674,9 +1674,21 @@ Object** FixedArray::data_start() { |
| bool DescriptorArray::IsEmpty() { |
| - ASSERT(this->length() > kFirstIndex || |
| + ASSERT(this->IsSmi() || |
| + this->length() > kFirstIndex || |
| this == HEAP->empty_descriptor_array()); |
| - return length() <= kFirstIndex; |
| + return this->IsSmi() || length() <= kFirstIndex; |
| +} |
| + |
| + |
| +int DescriptorArray::bit_field3_storage() { |
| + Object* storage = READ_FIELD(this, kBitField3StorageOffset); |
| + return Smi::cast(storage)->value(); |
| +} |
| + |
| +void DescriptorArray::set_bit_field3_storage(int value) { |
| + !IsEmpty(); |
|
Mads Ager (chromium)
2011/05/23 10:14:51
ASSERT(!IsEmpty()) ?
danno
2011/06/01 13:15:11
Done.
|
| + WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value)); |
| } |
| @@ -2967,8 +2979,85 @@ MaybeObject* Map::GetSlowElementsMap() { |
| } |
| -ACCESSORS(Map, instance_descriptors, DescriptorArray, |
| - kInstanceDescriptorsOffset) |
| +DescriptorArray* Map::instance_descriptors() { |
| + Object* object = READ_FIELD(this, |
|
Mads Ager (chromium)
2011/05/23 10:14:51
Doesn't this fit on one line? Ditto for the occurr
danno
2011/06/01 13:15:11
Done.
|
| + kInstanceDescriptorsOrBitField3Offset); |
| + if (object->IsSmi()) { |
| + return HEAP->empty_descriptor_array(); |
| + } else { |
| + return DescriptorArray::cast(object); |
| + } |
| +} |
| + |
| + |
| +void Map::init_instance_descriptors() { |
| + WRITE_FIELD(this, |
| + kInstanceDescriptorsOrBitField3Offset, |
| + 0); |
|
Mads Ager (chromium)
2011/05/23 10:14:51
Smi::FromInt(0)
It is the same, but makes it expl
danno
2011/06/01 13:15:11
Done.
|
| +} |
| + |
| + |
| +void Map::clear_instance_descriptors() { |
| + Object* object = READ_FIELD(this, |
| + kInstanceDescriptorsOrBitField3Offset); |
| + if (!object->IsSmi()) { |
| + WRITE_FIELD( |
| + this, |
| + kInstanceDescriptorsOrBitField3Offset, |
| + Smi::FromInt(DescriptorArray::cast(object)->bit_field3_storage())); |
| + } |
| +} |
| + |
| + |
| +void Map::set_instance_descriptors(DescriptorArray* value, |
| + WriteBarrierMode mode) { |
| + Object* object = READ_FIELD(this, |
| + kInstanceDescriptorsOrBitField3Offset); |
| + if (value == HEAP->empty_descriptor_array()) { |
|
Mads Ager (chromium)
2011/05/23 10:14:51
You shouldn't have to go through thread local stor
danno
2011/06/01 13:15:11
Done.
|
| + clear_instance_descriptors(); |
| + return; |
| + } else { |
| + if (object->IsSmi()) { |
| + value->set_bit_field3_storage(Smi::cast(object)->value()); |
| + } else { |
| + value->set_bit_field3_storage( |
| + DescriptorArray::cast(object)->bit_field3_storage()); |
| + } |
| + } |
| + ASSERT(!is_shared()); |
| + WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value); |
| + CONDITIONAL_WRITE_BARRIER(GetHeap(), |
| + this, |
| + kInstanceDescriptorsOrBitField3Offset, |
| + mode); |
| +} |
| + |
| + |
| +int Map::bit_field3() { |
| + Object* object = READ_FIELD(this, |
| + kInstanceDescriptorsOrBitField3Offset); |
| + if (object->IsSmi()) { |
| + return Smi::cast(object)->value(); |
| + } else { |
| + return DescriptorArray::cast(object)->bit_field3_storage(); |
| + } |
| +} |
| + |
| + |
| +void Map::set_bit_field3(int value) { |
| + ASSERT((value & 0x80000000) == 0); // bit_field3 can only contain smis |
|
Mads Ager (chromium)
2011/05/23 10:14:51
ASSERT(Smi::IsValid(value))
danno
2011/06/01 13:15:11
Done.
|
| + Object* object = READ_FIELD(this, |
| + kInstanceDescriptorsOrBitField3Offset); |
| + if (object->IsSmi()) { |
| + WRITE_FIELD(this, |
| + kInstanceDescriptorsOrBitField3Offset, |
| + Smi::FromInt(value)); |
| + } else { |
| + DescriptorArray::cast(object)->set_bit_field3_storage(value); |
| + } |
| +} |
| + |
| + |
| ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) |
| ACCESSORS(Map, prototype_transitions, FixedArray, kPrototypeTransitionsOffset) |
| ACCESSORS(Map, constructor, Object, kConstructorOffset) |