OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 5738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5749 int transition_index = old_map->SearchTransition( | 5749 int transition_index = old_map->SearchTransition( |
5750 isolate->heap()->frozen_symbol()); | 5750 isolate->heap()->frozen_symbol()); |
5751 if (transition_index != TransitionArray::kNotFound) { | 5751 if (transition_index != TransitionArray::kNotFound) { |
5752 Handle<Map> transition_map(old_map->GetTransition(transition_index)); | 5752 Handle<Map> transition_map(old_map->GetTransition(transition_index)); |
5753 ASSERT(transition_map->has_dictionary_elements()); | 5753 ASSERT(transition_map->has_dictionary_elements()); |
5754 ASSERT(transition_map->is_frozen()); | 5754 ASSERT(transition_map->is_frozen()); |
5755 ASSERT(!transition_map->is_extensible()); | 5755 ASSERT(!transition_map->is_extensible()); |
5756 JSObject::MigrateToMap(object, transition_map); | 5756 JSObject::MigrateToMap(object, transition_map); |
5757 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) { | 5757 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) { |
5758 // Create a new descriptor array with fully-frozen properties | 5758 // Create a new descriptor array with fully-frozen properties |
5759 int num_descriptors = old_map->NumberOfOwnDescriptors(); | 5759 Handle<Map> new_map = Map::CopyForFreeze(old_map); |
5760 Handle<DescriptorArray> new_descriptors = | |
5761 DescriptorArray::CopyUpToAddAttributes( | |
5762 handle(old_map->instance_descriptors()), num_descriptors, FROZEN); | |
5763 Handle<Map> new_map = Map::CopyReplaceDescriptors( | |
5764 old_map, new_descriptors, INSERT_TRANSITION, | |
5765 isolate->factory()->frozen_symbol()); | |
5766 new_map->freeze(); | |
5767 new_map->set_is_extensible(false); | |
5768 new_map->set_elements_kind(DICTIONARY_ELEMENTS); | |
5769 JSObject::MigrateToMap(object, new_map); | 5760 JSObject::MigrateToMap(object, new_map); |
5770 } else { | 5761 } else { |
5771 // Slow path: need to normalize properties for safety | 5762 // Slow path: need to normalize properties for safety |
5772 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); | 5763 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); |
5773 | 5764 |
5774 // Create a new map, since other objects with this map may be extensible. | 5765 // Create a new map, since other objects with this map may be extensible. |
5775 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps. | 5766 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps. |
5776 Handle<Map> new_map = Map::Copy(handle(object->map())); | 5767 Handle<Map> new_map = Map::Copy(handle(object->map())); |
5777 new_map->freeze(); | 5768 new_map->freeze(); |
5778 new_map->set_is_extensible(false); | 5769 new_map->set_is_extensible(false); |
(...skipping 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6960 map->set_transitions(*transitions); | 6951 map->set_transitions(*transitions); |
6961 map->set_owns_descriptors(false); | 6952 map->set_owns_descriptors(false); |
6962 | 6953 |
6963 return result; | 6954 return result; |
6964 } | 6955 } |
6965 | 6956 |
6966 | 6957 |
6967 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map, | 6958 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map, |
6968 Handle<DescriptorArray> descriptors, | 6959 Handle<DescriptorArray> descriptors, |
6969 TransitionFlag flag, | 6960 TransitionFlag flag, |
6970 SimpleTransitionFlag simple_flag) { | 6961 MaybeHandle<Name> maybe_name, |
6971 return CopyReplaceDescriptors( | |
6972 map, descriptors, flag, Handle<Name>::null(), simple_flag); | |
6973 } | |
6974 | |
6975 | |
6976 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map, | |
6977 Handle<DescriptorArray> descriptors, | |
6978 TransitionFlag flag, | |
6979 Handle<Name> name, | |
6980 SimpleTransitionFlag simple_flag) { | 6962 SimpleTransitionFlag simple_flag) { |
6981 ASSERT(descriptors->IsSortedNoDuplicates()); | 6963 ASSERT(descriptors->IsSortedNoDuplicates()); |
6982 | 6964 |
6983 Handle<Map> result = CopyDropDescriptors(map); | 6965 Handle<Map> result = CopyDropDescriptors(map); |
6984 result->InitializeDescriptors(*descriptors); | 6966 result->InitializeDescriptors(*descriptors); |
6985 | 6967 |
6986 if (flag == INSERT_TRANSITION && map->CanHaveMoreTransitions()) { | 6968 if (flag == INSERT_TRANSITION && map->CanHaveMoreTransitions()) { |
| 6969 Handle<Name> name; |
| 6970 CHECK(maybe_name.ToHandle(&name)); |
6987 Handle<TransitionArray> transitions = TransitionArray::CopyInsert( | 6971 Handle<TransitionArray> transitions = TransitionArray::CopyInsert( |
6988 map, name, result, simple_flag); | 6972 map, name, result, simple_flag); |
6989 map->set_transitions(*transitions); | 6973 map->set_transitions(*transitions); |
6990 result->SetBackPointer(*map); | 6974 result->SetBackPointer(*map); |
6991 } else { | 6975 } else { |
6992 int length = descriptors->number_of_descriptors(); | 6976 int length = descriptors->number_of_descriptors(); |
6993 for (int i = 0; i < length; i++) { | 6977 for (int i = 0; i < length; i++) { |
6994 descriptors->SetRepresentation(i, Representation::Tagged()); | 6978 descriptors->SetRepresentation(i, Representation::Tagged()); |
6995 if (descriptors->GetDetails(i).type() == FIELD) { | 6979 if (descriptors->GetDetails(i).type() == FIELD) { |
6996 descriptors->SetValue(i, HeapType::Any()); | 6980 descriptors->SetValue(i, HeapType::Any()); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7113 new_map->SetBackPointer(*map); | 7097 new_map->SetBackPointer(*map); |
7114 return new_map; | 7098 return new_map; |
7115 } | 7099 } |
7116 | 7100 |
7117 | 7101 |
7118 Handle<Map> Map::Copy(Handle<Map> map) { | 7102 Handle<Map> Map::Copy(Handle<Map> map) { |
7119 Handle<DescriptorArray> descriptors(map->instance_descriptors()); | 7103 Handle<DescriptorArray> descriptors(map->instance_descriptors()); |
7120 int number_of_own_descriptors = map->NumberOfOwnDescriptors(); | 7104 int number_of_own_descriptors = map->NumberOfOwnDescriptors(); |
7121 Handle<DescriptorArray> new_descriptors = | 7105 Handle<DescriptorArray> new_descriptors = |
7122 DescriptorArray::CopyUpTo(descriptors, number_of_own_descriptors); | 7106 DescriptorArray::CopyUpTo(descriptors, number_of_own_descriptors); |
7123 return CopyReplaceDescriptors(map, new_descriptors, OMIT_TRANSITION); | 7107 return CopyReplaceDescriptors( |
| 7108 map, new_descriptors, OMIT_TRANSITION, MaybeHandle<Name>()); |
7124 } | 7109 } |
7125 | 7110 |
7126 | 7111 |
7127 Handle<Map> Map::Create(Handle<JSFunction> constructor, | 7112 Handle<Map> Map::Create(Handle<JSFunction> constructor, |
7128 int extra_inobject_properties) { | 7113 int extra_inobject_properties) { |
7129 Handle<Map> copy = Copy(handle(constructor->initial_map())); | 7114 Handle<Map> copy = Copy(handle(constructor->initial_map())); |
7130 | 7115 |
7131 // Check that we do not overflow the instance size when adding the | 7116 // Check that we do not overflow the instance size when adding the |
7132 // extra inobject properties. | 7117 // extra inobject properties. |
7133 int instance_size_delta = extra_inobject_properties * kPointerSize; | 7118 int instance_size_delta = extra_inobject_properties * kPointerSize; |
(...skipping 12 matching lines...) Expand all Loading... |
7146 int inobject_properties = | 7131 int inobject_properties = |
7147 copy->inobject_properties() + extra_inobject_properties; | 7132 copy->inobject_properties() + extra_inobject_properties; |
7148 copy->set_inobject_properties(inobject_properties); | 7133 copy->set_inobject_properties(inobject_properties); |
7149 copy->set_unused_property_fields(inobject_properties); | 7134 copy->set_unused_property_fields(inobject_properties); |
7150 copy->set_instance_size(copy->instance_size() + instance_size_delta); | 7135 copy->set_instance_size(copy->instance_size() + instance_size_delta); |
7151 copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy)); | 7136 copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy)); |
7152 return copy; | 7137 return copy; |
7153 } | 7138 } |
7154 | 7139 |
7155 | 7140 |
| 7141 Handle<Map> Map::CopyForFreeze(Handle<Map> map) { |
| 7142 int num_descriptors = map->NumberOfOwnDescriptors(); |
| 7143 Isolate* isolate = map->GetIsolate(); |
| 7144 Handle<DescriptorArray> new_desc = DescriptorArray::CopyUpToAddAttributes( |
| 7145 handle(map->instance_descriptors(), isolate), num_descriptors, FROZEN); |
| 7146 Handle<Map> new_map = Map::CopyReplaceDescriptors( |
| 7147 map, new_desc, INSERT_TRANSITION, isolate->factory()->frozen_symbol()); |
| 7148 new_map->freeze(); |
| 7149 new_map->set_is_extensible(false); |
| 7150 new_map->set_elements_kind(DICTIONARY_ELEMENTS); |
| 7151 return new_map; |
| 7152 } |
| 7153 |
| 7154 |
7156 Handle<Map> Map::CopyAddDescriptor(Handle<Map> map, | 7155 Handle<Map> Map::CopyAddDescriptor(Handle<Map> map, |
7157 Descriptor* descriptor, | 7156 Descriptor* descriptor, |
7158 TransitionFlag flag) { | 7157 TransitionFlag flag) { |
7159 Handle<DescriptorArray> descriptors(map->instance_descriptors()); | 7158 Handle<DescriptorArray> descriptors(map->instance_descriptors()); |
7160 | 7159 |
7161 // Ensure the key is unique. | 7160 // Ensure the key is unique. |
7162 descriptor->KeyToUniqueName(); | 7161 descriptor->KeyToUniqueName(); |
7163 | 7162 |
7164 if (flag == INSERT_TRANSITION && | 7163 if (flag == INSERT_TRANSITION && |
7165 map->owns_descriptors() && | 7164 map->owns_descriptors() && |
(...skipping 9422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16588 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16587 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16589 static const char* error_messages_[] = { | 16588 static const char* error_messages_[] = { |
16590 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16589 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16591 }; | 16590 }; |
16592 #undef ERROR_MESSAGES_TEXTS | 16591 #undef ERROR_MESSAGES_TEXTS |
16593 return error_messages_[reason]; | 16592 return error_messages_[reason]; |
16594 } | 16593 } |
16595 | 16594 |
16596 | 16595 |
16597 } } // namespace v8::internal | 16596 } } // namespace v8::internal |
OLD | NEW |