| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index 841fcbc0f335d12d4f97d0cd45cd0c2673acf59a..3828db82f01bcb022cade9e25a56607b4b6e8068 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) {
|
| + ASSERT(!IsEmpty());
|
| + WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value));
|
| }
|
|
|
|
|
| @@ -2967,8 +2979,82 @@ MaybeObject* Map::GetSlowElementsMap() {
|
| }
|
|
|
|
|
| -ACCESSORS(Map, instance_descriptors, DescriptorArray,
|
| - kInstanceDescriptorsOffset)
|
| +DescriptorArray* Map::instance_descriptors() {
|
| + Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
|
| + if (object->IsSmi()) {
|
| + return HEAP->empty_descriptor_array();
|
| + } else {
|
| + return DescriptorArray::cast(object);
|
| + }
|
| +}
|
| +
|
| +
|
| +void Map::init_instance_descriptors() {
|
| + WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, Smi::FromInt(0));
|
| +}
|
| +
|
| +
|
| +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 == isolate()->heap()->empty_descriptor_array()) {
|
| + 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(Smi::IsValid(value));
|
| + 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)
|
|
|