Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index 408e35ab421e97a22d19533dbfb020c695e05e22..dd4341b45558a94a9d6be3f69fff34839a9bf2ac 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -2119,7 +2119,26 @@ Handle<TransitionArray> Map::SetElementsTransitionMap( |
| } |
| -// To migrate an instance to a map: |
| +void JSObject::MigrateToMap(Handle<JSObject> object, Handle<Map> new_map) { |
| + if (object->map() == *new_map) return; |
| + if (object->HasFastProperties()) { |
| + if (!new_map->is_dictionary_map()) { |
| + MigrateFastToFast(object, new_map); |
| + } else { |
| + MigrateFastToSlow(object, new_map, 0); |
| + } |
| + } else { |
| + // For slow-to-fast migrations JSObject::TransformToFastProperties() |
| + // must be used instead. |
| + CHECK(new_map->is_dictionary_map()); |
| + |
| + // Slow-to-slow migration is trivial. |
| + object->set_map(*new_map); |
| + } |
| +} |
| + |
| + |
| +// To migrate an fast instance to a fast map: |
|
Toon Verwaest
2014/06/24 13:17:33
a fast
|
| // - First check whether the instance needs to be rewritten. If not, simply |
| // change the map. |
| // - Otherwise, allocate a fixed array large enough to hold all fields, in |
| @@ -2134,7 +2153,7 @@ Handle<TransitionArray> Map::SetElementsTransitionMap( |
| // to temporarily store the inobject properties. |
| // * If there are properties left in the backing store, install the backing |
| // store. |
| -void JSObject::MigrateToMap(Handle<JSObject> object, Handle<Map> new_map) { |
| +void JSObject::MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map) { |
| Isolate* isolate = object->GetIsolate(); |
| Handle<Map> old_map(object->map()); |
| int number_of_fields = new_map->NumberOfFields(); |
| @@ -2276,8 +2295,7 @@ void JSObject::GeneralizeFieldRepresentation(Handle<JSObject> object, |
| Handle<Map> new_map = Map::GeneralizeRepresentation( |
| handle(object->map()), modify_index, new_representation, |
| new_field_type, store_mode); |
| - if (object->map() == *new_map) return; |
| - return MigrateToMap(object, new_map); |
| + MigrateToMap(object, new_map); |
| } |
| @@ -4570,6 +4588,16 @@ void JSObject::NormalizeProperties(Handle<JSObject> object, |
| int expected_additional_properties) { |
| if (!object->HasFastProperties()) return; |
| + Handle<Map> map(object->map()); |
| + Handle<Map> new_map = Map::Normalize(map, mode); |
| + |
| + MigrateFastToSlow(object, new_map, expected_additional_properties); |
| +} |
| + |
| + |
| +void JSObject::MigrateFastToSlow(Handle<JSObject> object, |
| + Handle<Map> new_map, |
| + int expected_additional_properties) { |
| // The global object is always normalized. |
| ASSERT(!object->IsGlobalObject()); |
| // JSGlobalProxy must never be normalized |
| @@ -4578,7 +4606,6 @@ void JSObject::NormalizeProperties(Handle<JSObject> object, |
| Isolate* isolate = object->GetIsolate(); |
| HandleScope scope(isolate); |
| Handle<Map> map(object->map()); |
| - Handle<Map> new_map = Map::Normalize(map, mode); |
| // Allocate new content. |
| int real_size = map->NumberOfOwnDescriptors(); |