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()); |