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; |
} |