Chromium Code Reviews| 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.
|
| } |
| } |