Convert argument toObject() in Object.getOwnPropertyNames/Descriptors
authordslomov@chromium.org <dslomov@chromium.org>
Wed, 15 Oct 2014 14:01:20 +0000 (14:01 +0000)
committerdslomov@chromium.org <dslomov@chromium.org>
Wed, 15 Oct 2014 14:01:20 +0000 (14:01 +0000)
BUG=v8:3443
LOG=Y
R=arv@chromium.org, dslomov@chromium.org

Review URL: https://codereview.chromium.org/613283002

Patch from Caitlin Potter <caitpotter88@gmail.com>.

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24638 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/symbol.js
src/v8natives.js
test/mjsunit/es6/symbols.js
test/mjsunit/object-get-own-property-names.js
test/test262/test262.status

index ce3327bbdbaf7beac83a07073c49ac64f869a863..e00979019010e93d47634b055725e8a68009179b 100644 (file)
@@ -69,10 +69,7 @@ function SymbolKeyFor(symbol) {
 
 // ES6 19.1.2.8
 function ObjectGetOwnPropertySymbols(obj) {
-  if (!IS_SPEC_OBJECT(obj)) {
-    throw MakeTypeError("called_on_non_object",
-                        ["Object.getOwnPropertySymbols"]);
-  }
+  obj = ToObject(obj);
 
   // TODO(arv): Proxies use a shared trap for String and Symbol keys.
 
index 7d44928229813bb426dbc7978ca126a856c3ed9b..92a889a12fbbf0dc55cbab60a6f4891260484d9c 100644 (file)
@@ -1107,9 +1107,7 @@ function ObjectGetOwnPropertyKeys(obj, symbolsOnly) {
 
 // ES5 section 15.2.3.4.
 function ObjectGetOwnPropertyNames(obj) {
-  if (!IS_SPEC_OBJECT(obj)) {
-    throw MakeTypeError("called_on_non_object", ["Object.getOwnPropertyNames"]);
-  }
+  obj = ToObject(obj);
   // Special handling for proxies.
   if (%_IsJSProxy(obj)) {
     var handler = %GetHandler(obj);
index 60737af4b9833495e3e59b1af8d67edb3d1cc160..d4a968a04c262dbfd277483ebfdbc476689b56de 100644 (file)
@@ -501,3 +501,11 @@ function TestRegistry() {
   assertSame("x3", Symbol.keyFor(symbol3))
 }
 TestRegistry()
+
+
+function TestGetOwnPropertySymbolsOnPrimitives() {
+  assertEquals(Object.getOwnPropertySymbols(true), []);
+  assertEquals(Object.getOwnPropertySymbols(5000), []);
+  assertEquals(Object.getOwnPropertySymbols("OK"), []);
+}
+TestGetOwnPropertySymbolsOnPrimitives();
index 64607c6b94a2713394207e569457bc6efa4b7b9d..aee6585680b8767d40963e0da52f762b9a0f6640 100644 (file)
@@ -87,30 +87,20 @@ assertEquals('bar', propertyNames[1]);
 assertSame(Array.prototype, propertyNames.__proto__);
 Array.prototype.concat = savedConcat;
 
-try {
-  Object.getOwnPropertyNames(4);
-  assertTrue(false);
-} catch (e) {
-  assertTrue(/on non-object/.test(e));
-}
-
-try {
-  Object.getOwnPropertyNames("foo");
-  assertTrue(false);
-} catch (e) {
-  assertTrue(/on non-object/.test(e));
-}
+assertEquals(Object.getOwnPropertyNames(4), []);
+assertEquals(Object.getOwnPropertyNames("foo"), ["0", "1", "2", "length"]);
+assertEquals(Object.getOwnPropertyNames(true), []);
 
 try {
   Object.getOwnPropertyNames(undefined);
   assertTrue(false);
 } catch (e) {
-  assertTrue(/on non-object/.test(e));
+  assertTrue(/Cannot convert undefined or null to object/.test(e));
 }
 
 try {
   Object.getOwnPropertyNames(null);
   assertTrue(false);
 } catch (e) {
-  assertTrue(/on non-object/.test(e));
+  assertTrue(/Cannot convert undefined or null to object/.test(e));
 }
index a5c5a1ab5489f96876249c7a2366739f2b03ced4..87fec5a346c091b38c1ecf62060e95fde5632ea3 100644 (file)
   '15.2.3.14-1-2': [FAIL_OK],
   '15.2.3.14-1-3': [FAIL_OK],
 
+  # Object.getOwnPropertyNames(O) no longer throws when passed a primitive value.
+  '15.2.3.4-1-4': [FAIL_OK],
+  '15.2.3.4-1-5': [FAIL_OK],
+  '15.2.3.4-1': [FAIL_OK],
+
   ############################ SKIPPED TESTS #############################
 
   # These tests take a looong time to run in debug mode.