| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 2843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2854 map = GeneralizeRepresentation(map, i, Representation::Tagged(), | 2854 map = GeneralizeRepresentation(map, i, Representation::Tagged(), |
| 2855 HeapType::Any(map->GetIsolate()), | 2855 HeapType::Any(map->GetIsolate()), |
| 2856 FORCE_FIELD); | 2856 FORCE_FIELD); |
| 2857 } | 2857 } |
| 2858 } | 2858 } |
| 2859 return map; | 2859 return map; |
| 2860 } | 2860 } |
| 2861 | 2861 |
| 2862 | 2862 |
| 2863 // static | 2863 // static |
| 2864 MaybeHandle<Map> Map::CurrentMapForDeprecated(Handle<Map> map) { | 2864 MaybeHandle<Map> Map::TryUpdate(Handle<Map> map) { |
| 2865 Handle<Map> proto_map(map); | 2865 Handle<Map> proto_map(map); |
| 2866 while (proto_map->prototype()->IsJSObject()) { | 2866 while (proto_map->prototype()->IsJSObject()) { |
| 2867 Handle<JSObject> holder(JSObject::cast(proto_map->prototype())); | 2867 Handle<JSObject> holder(JSObject::cast(proto_map->prototype())); |
| 2868 proto_map = Handle<Map>(holder->map()); | 2868 proto_map = Handle<Map>(holder->map()); |
| 2869 if (proto_map->is_deprecated() && JSObject::TryMigrateInstance(holder)) { | 2869 if (proto_map->is_deprecated() && JSObject::TryMigrateInstance(holder)) { |
| 2870 proto_map = Handle<Map>(holder->map()); | 2870 proto_map = Handle<Map>(holder->map()); |
| 2871 } | 2871 } |
| 2872 } | 2872 } |
| 2873 return CurrentMapForDeprecatedInternal(map); | 2873 return TryUpdateInternal(map); |
| 2874 } | 2874 } |
| 2875 | 2875 |
| 2876 | 2876 |
| 2877 // static | 2877 // static |
| 2878 MaybeHandle<Map> Map::CurrentMapForDeprecatedInternal(Handle<Map> old_map) { | 2878 Handle<Map> Map::Update(Handle<Map> map) { |
| 2879 return GeneralizeRepresentation(map, 0, Representation::None(), |
| 2880 HeapType::None(map->GetIsolate()), |
| 2881 ALLOW_AS_CONSTANT); |
| 2882 } |
| 2883 |
| 2884 |
| 2885 // static |
| 2886 MaybeHandle<Map> Map::TryUpdateInternal(Handle<Map> old_map) { |
| 2879 DisallowHeapAllocation no_allocation; | 2887 DisallowHeapAllocation no_allocation; |
| 2880 DisallowDeoptimization no_deoptimization(old_map->GetIsolate()); | 2888 DisallowDeoptimization no_deoptimization(old_map->GetIsolate()); |
| 2881 | 2889 |
| 2882 if (!old_map->is_deprecated()) return old_map; | 2890 if (!old_map->is_deprecated()) return old_map; |
| 2883 | 2891 |
| 2884 // Check the state of the root map. | 2892 // Check the state of the root map. |
| 2885 Map* root_map = old_map->FindRootMap(); | 2893 Map* root_map = old_map->FindRootMap(); |
| 2886 if (!old_map->EquivalentToForTransition(root_map)) return MaybeHandle<Map>(); | 2894 if (!old_map->EquivalentToForTransition(root_map)) return MaybeHandle<Map>(); |
| 2887 int root_nof = root_map->NumberOfOwnDescriptors(); | 2895 int root_nof = root_map->NumberOfOwnDescriptors(); |
| 2888 | 2896 |
| (...skipping 1044 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3933 } else { | 3941 } else { |
| 3934 TransitionElementsKind(object, to_kind); | 3942 TransitionElementsKind(object, to_kind); |
| 3935 } | 3943 } |
| 3936 map = Map::AsElementsKind(map, to_kind); | 3944 map = Map::AsElementsKind(map, to_kind); |
| 3937 } | 3945 } |
| 3938 JSObject::MigrateToMap(object, map); | 3946 JSObject::MigrateToMap(object, map); |
| 3939 } | 3947 } |
| 3940 | 3948 |
| 3941 | 3949 |
| 3942 void JSObject::MigrateInstance(Handle<JSObject> object) { | 3950 void JSObject::MigrateInstance(Handle<JSObject> object) { |
| 3943 // Converting any field to the most specific type will cause the | |
| 3944 // GeneralizeFieldRepresentation algorithm to create the most general existing | |
| 3945 // transition that matches the object. This achieves what is needed. | |
| 3946 Handle<Map> original_map(object->map()); | 3951 Handle<Map> original_map(object->map()); |
| 3947 GeneralizeFieldRepresentation( | 3952 Handle<Map> map = Map::Update(original_map); |
| 3948 object, 0, Representation::None(), | 3953 map->set_migration_target(true); |
| 3949 HeapType::None(object->GetIsolate()), | 3954 MigrateToMap(object, map); |
| 3950 ALLOW_AS_CONSTANT); | |
| 3951 object->map()->set_migration_target(true); | |
| 3952 if (FLAG_trace_migration) { | 3955 if (FLAG_trace_migration) { |
| 3953 object->PrintInstanceMigration(stdout, *original_map, object->map()); | 3956 object->PrintInstanceMigration(stdout, *original_map, *map); |
| 3954 } | 3957 } |
| 3955 } | 3958 } |
| 3956 | 3959 |
| 3957 | 3960 |
| 3958 // static | 3961 // static |
| 3959 bool JSObject::TryMigrateInstance(Handle<JSObject> object) { | 3962 bool JSObject::TryMigrateInstance(Handle<JSObject> object) { |
| 3960 Isolate* isolate = object->GetIsolate(); | 3963 Isolate* isolate = object->GetIsolate(); |
| 3961 DisallowDeoptimization no_deoptimization(isolate); | 3964 DisallowDeoptimization no_deoptimization(isolate); |
| 3962 Handle<Map> original_map(object->map(), isolate); | 3965 Handle<Map> original_map(object->map(), isolate); |
| 3963 Handle<Map> new_map; | 3966 Handle<Map> new_map; |
| 3964 if (!Map::CurrentMapForDeprecatedInternal(original_map).ToHandle(&new_map)) { | 3967 if (!Map::TryUpdate(original_map).ToHandle(&new_map)) { |
| 3965 return false; | 3968 return false; |
| 3966 } | 3969 } |
| 3967 JSObject::MigrateToMap(object, new_map); | 3970 JSObject::MigrateToMap(object, new_map); |
| 3968 if (FLAG_trace_migration) { | 3971 if (FLAG_trace_migration) { |
| 3969 object->PrintInstanceMigration(stdout, *original_map, object->map()); | 3972 object->PrintInstanceMigration(stdout, *original_map, object->map()); |
| 3970 } | 3973 } |
| 3971 return true; | 3974 return true; |
| 3972 } | 3975 } |
| 3973 | 3976 |
| 3974 | 3977 |
| (...skipping 3344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7319 return false; | 7322 return false; |
| 7320 } | 7323 } |
| 7321 | 7324 |
| 7322 | 7325 |
| 7323 Handle<Map> Map::PrepareForDataProperty(Handle<Map> map, int descriptor, | 7326 Handle<Map> Map::PrepareForDataProperty(Handle<Map> map, int descriptor, |
| 7324 Handle<Object> value) { | 7327 Handle<Object> value) { |
| 7325 // Dictionaries can store any property value. | 7328 // Dictionaries can store any property value. |
| 7326 if (map->is_dictionary_map()) return map; | 7329 if (map->is_dictionary_map()) return map; |
| 7327 | 7330 |
| 7328 // Migrate to the newest map before storing the property. | 7331 // Migrate to the newest map before storing the property. |
| 7329 if (map->is_deprecated()) { | 7332 if (map->is_deprecated()) map = Update(map); |
| 7330 map = GeneralizeRepresentation(map, 0, Representation::None(), | |
| 7331 HeapType::None(map->GetIsolate()), | |
| 7332 ALLOW_AS_CONSTANT); | |
| 7333 } | |
| 7334 | 7333 |
| 7335 Handle<DescriptorArray> descriptors(map->instance_descriptors()); | 7334 Handle<DescriptorArray> descriptors(map->instance_descriptors()); |
| 7336 | 7335 |
| 7337 if (descriptors->CanHoldValue(descriptor, *value)) return map; | 7336 if (descriptors->CanHoldValue(descriptor, *value)) return map; |
| 7338 | 7337 |
| 7339 Isolate* isolate = map->GetIsolate(); | 7338 Isolate* isolate = map->GetIsolate(); |
| 7340 Representation representation = value->OptimalRepresentation(); | 7339 Representation representation = value->OptimalRepresentation(); |
| 7341 Handle<HeapType> type = value->OptimalType(isolate, representation); | 7340 Handle<HeapType> type = value->OptimalType(isolate, representation); |
| 7342 | 7341 |
| 7343 return GeneralizeRepresentation(map, descriptor, representation, type, | 7342 return GeneralizeRepresentation(map, descriptor, representation, type, |
| 7344 FORCE_FIELD); | 7343 FORCE_FIELD); |
| 7345 } | 7344 } |
| 7346 | 7345 |
| 7347 | 7346 |
| 7348 Handle<Map> Map::TransitionToDataProperty(Handle<Map> map, Handle<Name> name, | 7347 Handle<Map> Map::TransitionToDataProperty(Handle<Map> map, Handle<Name> name, |
| 7349 Handle<Object> value, | 7348 Handle<Object> value, |
| 7350 PropertyAttributes attributes, | 7349 PropertyAttributes attributes, |
| 7351 StoreFromKeyed store_mode) { | 7350 StoreFromKeyed store_mode) { |
| 7352 // Dictionary maps can always have additional data properties. | 7351 // Dictionary maps can always have additional data properties. |
| 7353 if (map->is_dictionary_map()) return map; | 7352 if (map->is_dictionary_map()) return map; |
| 7354 | 7353 |
| 7355 // Migrate to the newest map before transitioning to the new property. | 7354 // Migrate to the newest map before transitioning to the new property. |
| 7356 if (map->is_deprecated()) { | 7355 if (map->is_deprecated()) map = Update(map); |
| 7357 map = GeneralizeRepresentation(map, 0, Representation::None(), | |
| 7358 HeapType::None(map->GetIsolate()), | |
| 7359 ALLOW_AS_CONSTANT); | |
| 7360 } | |
| 7361 | 7356 |
| 7362 int index = map->SearchTransition(*name); | 7357 int index = map->SearchTransition(*name); |
| 7363 if (index != TransitionArray::kNotFound) { | 7358 if (index != TransitionArray::kNotFound) { |
| 7364 Handle<Map> transition(map->GetTransition(index)); | 7359 Handle<Map> transition(map->GetTransition(index)); |
| 7365 int descriptor = transition->LastAdded(); | 7360 int descriptor = transition->LastAdded(); |
| 7366 | 7361 |
| 7367 // TODO(verwaest): Handle attributes better. | 7362 // TODO(verwaest): Handle attributes better. |
| 7368 DescriptorArray* descriptors = transition->instance_descriptors(); | 7363 DescriptorArray* descriptors = transition->instance_descriptors(); |
| 7369 if (descriptors->GetDetails(descriptor).attributes() != attributes) { | 7364 if (descriptors->GetDetails(descriptor).attributes() != attributes) { |
| 7370 return CopyGeneralizeAllRepresentations(transition, descriptor, | 7365 return CopyGeneralizeAllRepresentations(transition, descriptor, |
| (...skipping 9589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16960 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16955 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16961 static const char* error_messages_[] = { | 16956 static const char* error_messages_[] = { |
| 16962 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16957 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16963 }; | 16958 }; |
| 16964 #undef ERROR_MESSAGES_TEXTS | 16959 #undef ERROR_MESSAGES_TEXTS |
| 16965 return error_messages_[reason]; | 16960 return error_messages_[reason]; |
| 16966 } | 16961 } |
| 16967 | 16962 |
| 16968 | 16963 |
| 16969 } } // namespace v8::internal | 16964 } } // namespace v8::internal |
| OLD | NEW |