| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index e4f165ae44e5e64051c8ea176e5687b6869ef11b..e21847ab1573a97afbf916965e1f835df39206db 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -5730,6 +5730,11 @@ void DescriptorArray::SetEnumCache(FixedArray* bridge_storage,
|
| }
|
|
|
|
|
| +static bool InsertionPointFound(String* key1, String* key2) {
|
| + return key1->Hash() > key2->Hash() || key1 == key2;
|
| +}
|
| +
|
| +
|
| MaybeObject* DescriptorArray::CopyInsert(Descriptor* descriptor,
|
| TransitionFlag transition_flag) {
|
| // Transitions are only kept when inserting another transition.
|
| @@ -5802,28 +5807,24 @@ MaybeObject* DescriptorArray::CopyInsert(Descriptor* descriptor,
|
|
|
| // Copy the descriptors, filtering out transitions and null descriptors,
|
| // and inserting or replacing a descriptor.
|
| - uint32_t descriptor_hash = descriptor->GetKey()->Hash();
|
| - int from_index = 0;
|
| int to_index = 0;
|
| -
|
| - for (; from_index < number_of_descriptors(); from_index++) {
|
| - String* key = GetKey(from_index);
|
| - if (key->Hash() > descriptor_hash || key == descriptor->GetKey()) {
|
| - break;
|
| + int insertion_index = -1;
|
| + int from_index = 0;
|
| + while (from_index < number_of_descriptors()) {
|
| + if (insertion_index < 0 &&
|
| + InsertionPointFound(GetKey(from_index), descriptor->GetKey())) {
|
| + insertion_index = to_index++;
|
| + if (replacing) from_index++;
|
| + } else {
|
| + if (!(IsNullDescriptor(from_index) ||
|
| + (remove_transitions && IsTransitionOnly(from_index)))) {
|
| + new_descriptors->CopyFrom(to_index++, this, from_index, witness);
|
| + }
|
| + from_index++;
|
| }
|
| - if (IsNullDescriptor(from_index)) continue;
|
| - if (remove_transitions && IsTransitionOnly(from_index)) continue;
|
| - new_descriptors->CopyFrom(to_index++, this, from_index, witness);
|
| - }
|
| -
|
| - new_descriptors->Set(to_index++, descriptor, witness);
|
| - if (replacing) from_index++;
|
| -
|
| - for (; from_index < number_of_descriptors(); from_index++) {
|
| - if (IsNullDescriptor(from_index)) continue;
|
| - if (remove_transitions && IsTransitionOnly(from_index)) continue;
|
| - new_descriptors->CopyFrom(to_index++, this, from_index, witness);
|
| }
|
| + if (insertion_index < 0) insertion_index = to_index++;
|
| + new_descriptors->Set(insertion_index, descriptor, witness);
|
|
|
| ASSERT(to_index == new_descriptors->number_of_descriptors());
|
| SLOW_ASSERT(new_descriptors->IsSortedNoDuplicates());
|
|
|