[es6] JSObject::GetOwnElementKeys should collect String wrapper keys first
authoradamk <adamk@chromium.org>
Wed, 15 Jul 2015 07:31:26 +0000 (00:31 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 15 Jul 2015 07:31:40 +0000 (07:31 +0000)
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
test/test262-es6/test262-es6.status

index b52dba8..b212f94 100644 (file)
@@ -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;
 }
index 62261f2..8a699a0 100644 (file)
   '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],