Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index 3cf8378162844a1fc00525e3ccacdb6f47406ac5..7f386125b75b1fe2a1217088dbf4d09ce3d3e788 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -982,19 +982,22 @@ class ElementsAccessorBase : public ElementsAccessor { |
Isolate* isolate = object->GetIsolate(); |
uint32_t nof_property_keys = keys->length(); |
uint32_t initial_list_length = |
- Subclass::GetCapacityImpl(*object, *backing_store); |
+ Subclass::GetMaxNumberOfEntries(*object, *backing_store); |
initial_list_length += nof_property_keys; |
+ bool needs_sorting = |
+ IsDictionaryElementsKind(kind()) || IsSloppyArgumentsElements(kind()); |
+ |
// Collect the element indices into a new list. |
uint32_t nof_indices = 0; |
Handle<FixedArray> combined_keys = |
isolate->factory()->NewFixedArray(initial_list_length); |
combined_keys = Subclass::DirectCollectElementIndicesImpl( |
- isolate, object, backing_store, convert, filter, combined_keys, |
- &nof_indices); |
+ isolate, object, backing_store, |
+ needs_sorting ? GetKeysConversion::kKeepNumbers : convert, filter, |
+ combined_keys, &nof_indices); |
- // Sort the indices list if necessary. |
- if (IsDictionaryElementsKind(kind()) || IsSloppyArgumentsElements(kind())) { |
+ if (needs_sorting) { |
SortIndices(combined_keys, nof_indices, SKIP_WRITE_BARRIER); |
uint32_t array_length = 0; |
// Indices from dictionary elements should only be converted after |
@@ -1021,7 +1024,9 @@ class ElementsAccessorBase : public ElementsAccessor { |
CopyObjectToObjectElements(*keys, FAST_ELEMENTS, 0, *combined_keys, |
FAST_ELEMENTS, nof_indices, nof_property_keys); |
- if (IsHoleyElementsKind(kind())) { |
+ // For holey elements and arguments we might have to shrink the collected |
+ // keys since the estimates might be off. |
+ if (IsHoleyElementsKind(kind()) || IsSloppyArgumentsElements(kind())) { |
// Shrink combined_keys to the final size. |
int final_size = nof_indices + nof_property_keys; |
DCHECK_LE(final_size, combined_keys->length()); |
@@ -2305,6 +2310,14 @@ class SloppyArgumentsElementsAccessor |
ArgumentsAccessor::GetCapacityImpl(holder, arguments); |
} |
+ static uint32_t GetMaxNumberOfEntries(JSObject* holder, |
+ FixedArrayBase* backing_store) { |
+ FixedArray* parameter_map = FixedArray::cast(backing_store); |
+ FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); |
+ return parameter_map->length() - 2 + |
+ ArgumentsAccessor::GetMaxNumberOfEntries(holder, arguments); |
+ } |
+ |
static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, |
KeyAccumulator* accumulator, |
AddKeyConversion convert) { |