| Index: src/runtime/runtime-array.cc
|
| diff --git a/src/runtime/runtime-array.cc b/src/runtime/runtime-array.cc
|
| index a0b3080a092a4a1fa910338cfb18914038e601e6..e4519cbb535b937081479f6ada2f94b6c33117b9 100644
|
| --- a/src/runtime/runtime-array.cc
|
| +++ b/src/runtime/runtime-array.cc
|
| @@ -211,12 +211,19 @@ RUNTIME_FUNCTION(Runtime_GetArrayKeys) {
|
| JSObject::CollectOwnElementKeys(current, &accumulator, ALL_PROPERTIES);
|
| }
|
| // Erase any keys >= length.
|
| - // TODO(adamk): Remove this step when the contract of %GetArrayKeys
|
| - // is changed to let this happen on the JS side.
|
| Handle<FixedArray> keys = accumulator.GetKeys(KEEP_NUMBERS);
|
| + int j = 0;
|
| for (int i = 0; i < keys->length(); i++) {
|
| - if (NumberToUint32(keys->get(i)) >= length) keys->set_undefined(i);
|
| + if (NumberToUint32(keys->get(i)) >= length) continue;
|
| + if (i != j) keys->set(j, keys->get(i));
|
| + j++;
|
| }
|
| +
|
| + if (j != keys->length()) {
|
| + isolate->heap()->RightTrimFixedArray<Heap::CONCURRENT_TO_SWEEPER>(
|
| + *keys, keys->length() - j);
|
| + }
|
| +
|
| return *isolate->factory()->NewJSArrayWithElements(keys);
|
| }
|
|
|
|
|