Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index c53c205be1524c2acbe451b734c4d95860d2cef6..1ef47c9ca305020157f328d763e1ad5325891892 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -1904,22 +1904,7 @@ void JSObject::AddFastProperty(Handle<JSObject> object, |
| } |
| } |
| - JSObject::MigrateToMap(object, new_map); |
| - |
| - PropertyDetails details = new_map->GetLastDescriptorDetails(); |
| - if (details.type() != FIELD) return; |
| - |
| - Representation representation = details.representation(); |
| - int index = details.field_index(); |
| - |
| - if (representation.IsDouble()) { |
| - // Nothing more to be done. |
| - if (value->IsUninitialized()) return; |
| - HeapNumber* box = HeapNumber::cast(object->RawFastPropertyAt(index)); |
| - box->set_value(value->Number()); |
| - } else { |
| - object->FastPropertyAtPut(index, *value); |
| - } |
| + JSObject::MigrateToNewProperty(object, new_map, value); |
| } |
| @@ -3952,31 +3937,37 @@ MaybeHandle<Object> JSObject::SetPropertyUsingTransition( |
| field_representation, field_type, FORCE_FIELD); |
| } |
| - JSObject::MigrateToMap(object, transition_map); |
| + JSObject::MigrateToNewProperty(object, transition_map, value); |
| + return value; |
| +} |
| - // Reload. |
| - descriptors = handle(transition_map->instance_descriptors()); |
| - details = descriptors->GetDetails(descriptor); |
| - if (details.type() != FIELD) return value; |
| +void JSObject::MigrateToNewProperty(Handle<JSObject> object, |
| + Handle<Map> map, |
| + Handle<Object> value) { |
| + JSObject::MigrateToMap(object, map); |
| + if (map->GetLastDescriptorDetails().type() != FIELD) return; |
| + object->WriteToField(map->LastAdded(), *value); |
| +} |
| + |
| - int field_index = descriptors->GetFieldIndex(descriptor); |
| +void JSObject::WriteToField(int descriptor, Object* value) { |
|
Igor Sheludko
2014/04/16 09:50:03
Suggestion: you are not using handles here, what a
|
| + DescriptorArray* desc = map()->instance_descriptors(); |
| + PropertyDetails details = desc->GetDetails(descriptor); |
| + int field_index = desc->GetFieldIndex(descriptor); |
| if (details.representation().IsDouble()) { |
| // Nothing more to be done. |
| - if (value->IsUninitialized()) return value; |
| - HeapNumber* box = HeapNumber::cast(object->RawFastPropertyAt(field_index)); |
| + if (value->IsUninitialized()) return; |
| + HeapNumber* box = HeapNumber::cast(RawFastPropertyAt(field_index)); |
| box->set_value(value->Number()); |
| } else { |
| - object->FastPropertyAtPut(field_index, *value); |
| + FastPropertyAtPut(field_index, value); |
| } |
| - |
| - return value; |
| } |
| static void SetPropertyToField(LookupResult* lookup, |
| Handle<Object> value) { |
| - Representation representation = lookup->representation(); |
| if (lookup->type() == CONSTANT || !lookup->CanHoldValue(value)) { |
| Representation field_representation = value->OptimalRepresentation(); |
| Handle<HeapType> field_type = value->OptimalType( |
| @@ -3985,20 +3976,8 @@ static void SetPropertyToField(LookupResult* lookup, |
| lookup->GetDescriptorIndex(), |
| field_representation, field_type, |
| FORCE_FIELD); |
| - DescriptorArray* desc = lookup->holder()->map()->instance_descriptors(); |
| - int descriptor = lookup->GetDescriptorIndex(); |
| - representation = desc->GetDetails(descriptor).representation(); |
| } |
| - |
| - if (representation.IsDouble()) { |
| - HeapNumber* storage = HeapNumber::cast(lookup->holder()->RawFastPropertyAt( |
| - lookup->GetFieldIndex().field_index())); |
| - storage->set_value(value->Number()); |
| - return; |
| - } |
| - |
| - lookup->holder()->FastPropertyAtPut( |
| - lookup->GetFieldIndex().field_index(), *value); |
| + lookup->holder()->WriteToField(lookup->GetDescriptorIndex(), *value); |
| } |
| @@ -4028,9 +4007,7 @@ static void ConvertAndSetLocalProperty(LookupResult* lookup, |
| JSObject::MigrateToMap(object, new_map); |
| } |
| - DescriptorArray* descriptors = object->map()->instance_descriptors(); |
| - int index = descriptors->GetDetails(descriptor_index).field_index(); |
| - object->FastPropertyAtPut(index, *value); |
| + object->WriteToField(descriptor_index, *value); |
| } |
| @@ -5226,8 +5203,7 @@ Handle<Object> JSObject::SetHiddenPropertiesHashTable(Handle<JSObject> object, |
| if (descriptors->GetKey(sorted_index) == isolate->heap()->hidden_string() |
| && sorted_index < object->map()->NumberOfOwnDescriptors()) { |
| ASSERT(descriptors->GetType(sorted_index) == FIELD); |
|
Igor Sheludko
2014/04/16 09:50:03
Does it make sense to move this assert to WriteToF
|
| - object->FastPropertyAtPut(descriptors->GetFieldIndex(sorted_index), |
| - *value); |
| + object->WriteToField(sorted_index, *value); |
| return object; |
| } |
| } |