Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 6513482b718398a8fdb6967de89df78d3d1e52f4..31bbbdbeee74d4a29bc4145c6533fe1d814f85ae 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -2056,8 +2056,8 @@ MaybeObject* JSObject::ConvertTransitionToMapTransition( |
Map* old_target = old_map->GetTransition(transition_index); |
Object* result; |
- MaybeObject* maybe_result = |
- ConvertDescriptorToField(name, new_value, attributes); |
+ MaybeObject* maybe_result = ConvertDescriptorToField( |
+ name, new_value, attributes, OMIT_TRANSITION_KEEP_REPRESENTATIONS); |
if (!maybe_result->To(&result)) return maybe_result; |
if (!HasFastProperties()) return result; |
@@ -2098,7 +2098,8 @@ MaybeObject* JSObject::ConvertTransitionToMapTransition( |
MaybeObject* JSObject::ConvertDescriptorToField(Name* name, |
Object* new_value, |
- PropertyAttributes attributes) { |
+ PropertyAttributes attributes, |
+ TransitionFlag flag) { |
if (map()->unused_property_fields() == 0 && |
TooManyFastProperties(properties()->length(), MAY_BE_STORE_FROM_KEYED)) { |
Object* obj; |
@@ -2114,8 +2115,7 @@ MaybeObject* JSObject::ConvertDescriptorToField(Name* name, |
// Make a new map for the object. |
Map* new_map; |
- MaybeObject* maybe_new_map = map()->CopyInsertDescriptor(&new_field, |
- OMIT_TRANSITION); |
+ MaybeObject* maybe_new_map = map()->CopyInsertDescriptor(&new_field, flag); |
if (!maybe_new_map->To(&new_map)) return maybe_new_map; |
// Make new properties array if necessary. |
@@ -6389,7 +6389,7 @@ MaybeObject* Map::CopyReplaceDescriptors(DescriptorArray* descriptors, |
set_transitions(transitions); |
result->SetBackPointer(this); |
- } else { |
+ } else if (flag != OMIT_TRANSITION_KEEP_REPRESENTATIONS) { |
descriptors->InitializeRepresentations(Representation::Tagged()); |
} |
@@ -6397,6 +6397,8 @@ MaybeObject* Map::CopyReplaceDescriptors(DescriptorArray* descriptors, |
} |
+// Since this method is used to rewrite an existing transition tree, it can |
+// always insert transitions without checking. |
MaybeObject* Map::CopyInstallDescriptors(int new_descriptor, |
DescriptorArray* descriptors) { |
ASSERT(descriptors->IsSortedNoDuplicates()); |
@@ -6419,18 +6421,14 @@ MaybeObject* Map::CopyInstallDescriptors(int new_descriptor, |
result->set_unused_property_fields(unused_property_fields); |
result->set_owns_descriptors(false); |
- if (CanHaveMoreTransitions()) { |
- Name* name = descriptors->GetKey(new_descriptor); |
- TransitionArray* transitions; |
- MaybeObject* maybe_transitions = |
- AddTransition(name, result, SIMPLE_TRANSITION); |
- if (!maybe_transitions->To(&transitions)) return maybe_transitions; |
+ Name* name = descriptors->GetKey(new_descriptor); |
+ TransitionArray* transitions; |
+ MaybeObject* maybe_transitions = |
+ AddTransition(name, result, SIMPLE_TRANSITION); |
+ if (!maybe_transitions->To(&transitions)) return maybe_transitions; |
- set_transitions(transitions); |
- result->SetBackPointer(this); |
- } else { |
- descriptors->InitializeRepresentations(Representation::Tagged()); |
- } |
+ set_transitions(transitions); |
+ result->SetBackPointer(this); |
return result; |
} |