| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index aeb6bb5fe79dcc76682a389f2620fde06493121e..df5ffcfd20989cde9822f34e278f6051c1c087ee 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -12972,6 +12972,23 @@ int JSObject::NumberOfEnumElements() {
|
| int JSObject::GetOwnElementKeys(FixedArray* storage,
|
| PropertyAttributes filter) {
|
| int counter = 0;
|
| +
|
| + // If this is a String wrapper, add the string indices first,
|
| + // as they're guaranteed to preced the elements in numerical order
|
| + // and ascending order is required by ECMA-262, 6th, 9.1.12.
|
| + if (IsJSValue()) {
|
| + Object* val = JSValue::cast(this)->value();
|
| + if (val->IsString()) {
|
| + String* str = String::cast(val);
|
| + if (storage) {
|
| + for (int i = 0; i < str->length(); i++) {
|
| + storage->set(counter + i, Smi::FromInt(i));
|
| + }
|
| + }
|
| + counter += str->length();
|
| + }
|
| + }
|
| +
|
| switch (GetElementsKind()) {
|
| case FAST_SMI_ELEMENTS:
|
| case FAST_ELEMENTS:
|
| @@ -13078,18 +13095,6 @@ int JSObject::GetOwnElementKeys(FixedArray* storage,
|
| }
|
| }
|
|
|
| - if (this->IsJSValue()) {
|
| - Object* val = JSValue::cast(this)->value();
|
| - if (val->IsString()) {
|
| - String* str = String::cast(val);
|
| - if (storage) {
|
| - for (int i = 0; i < str->length(); i++) {
|
| - storage->set(counter + i, Smi::FromInt(i));
|
| - }
|
| - }
|
| - counter += str->length();
|
| - }
|
| - }
|
| DCHECK(!storage || storage->length() == counter);
|
| return counter;
|
| }
|
|
|