From 1e146c07088d4e0f5c25177be6b2245b562cb929 Mon Sep 17 00:00:00 2001 From: adamk Date: Wed, 15 Jul 2015 00:31:26 -0700 Subject: [PATCH] [es6] JSObject::GetOwnElementKeys should collect String wrapper keys first This makes Object.getOwnPropertyNames() return the integer keys in the proper order, following the spec: http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys BUG=v8:4118 LOG=n Review URL: https://codereview.chromium.org/1228803006 Cr-Commit-Position: refs/heads/master@{#29667} --- src/objects.cc | 29 +++++++++++++++++------------ test/test262-es6/test262-es6.status | 3 --- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/objects.cc b/src/objects.cc index b52dba8..b212f94 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -12962,6 +12962,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: @@ -13068,18 +13085,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; } diff --git a/test/test262-es6/test262-es6.status b/test/test262-es6/test262-es6.status index 62261f2..8a699a0 100644 --- a/test/test262-es6/test262-es6.status +++ b/test/test262-es6/test262-es6.status @@ -286,9 +286,6 @@ 'built-ins/Boolean/prototype/valueOf/S15.6.4.3_A1_T1': [FAIL], 'built-ins/Boolean/prototype/valueOf/S15.6.4.3_A1_T2': [FAIL], - # https://code.google.com/p/v8/issues/detail?id=4118 - 'built-ins/Object/getOwnPropertyNames/15.2.3.4-4-44': [FAIL], - # https://code.google.com/p/v8/issues/detail?id=3087 'built-ins/Array/prototype/every/15.4.4.16-3-12': [FAIL], 'built-ins/Array/prototype/every/15.4.4.16-3-14': [FAIL], -- 2.7.4