Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index db2c1eb75d5cfd40c7c7dfce590c96f4df9b13d0..26a0bac5dcf023e29c020763fd07077be695cec4 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -5051,7 +5051,8 @@ MaybeObject* Map::ShareDescriptor(Descriptor* descriptor) { |
MaybeObject* Map::CopyReplaceDescriptors(DescriptorArray* descriptors, |
String* name, |
- TransitionFlag flag) { |
+ TransitionFlag flag, |
+ int descriptor_index) { |
ASSERT(descriptors->IsSortedNoDuplicates()); |
Map* result; |
@@ -5068,7 +5069,11 @@ MaybeObject* Map::CopyReplaceDescriptors(DescriptorArray* descriptors, |
if (flag == INSERT_TRANSITION && CanHaveMoreTransitions()) { |
TransitionArray* transitions; |
- MaybeObject* maybe_transitions = AddTransition(name, result); |
+ SimpleTransitionFlag simple_flag = |
+ (descriptor_index == descriptors->number_of_descriptors() - 1) |
+ ? SIMPLE_TRANSITION |
+ : FULL_TRANSITION; |
+ MaybeObject* maybe_transitions = AddTransition(name, result, simple_flag); |
if (!maybe_transitions->To(&transitions)) return maybe_transitions; |
if (descriptors->IsEmpty()) { |
@@ -5304,7 +5309,7 @@ MaybeObject* Map::CopyReplaceDescriptor(Descriptor* descriptor, |
// Re-sort if descriptors were removed. |
if (new_size != descriptors->length()) new_descriptors->Sort(); |
- return CopyReplaceDescriptors(new_descriptors, key, flag); |
+ return CopyReplaceDescriptors(new_descriptors, key, flag, insertion_index); |
} |
@@ -7554,8 +7559,8 @@ void Map::ClearNonLiveTransitions(Heap* heap) { |
int trim = t->number_of_transitions() - transition_index; |
if (trim > 0) { |
- RightTrimFixedArray<FROM_GC>( |
- heap, t, trim * TransitionArray::kTransitionSize); |
+ if (!t->IsSimpleTransition()) trim *= TransitionArray::kTransitionSize; |
+ RightTrimFixedArray<FROM_GC>(heap, t, trim); |
Michael Starzinger
2012/09/19 09:34:55
Can we use "t->IsSimpleTransition() ? trim : trim
Toon Verwaest
2012/09/19 09:53:23
Done.
|
} |
} |