Convert `obj` ToObject in Object.keys()
authordslomov@chromium.org <dslomov@chromium.org>
Thu, 9 Oct 2014 13:19:02 +0000 (13:19 +0000)
committerdslomov@chromium.org <dslomov@chromium.org>
Thu, 9 Oct 2014 13:19:02 +0000 (13:19 +0000)
BUG=v8:3587
LOG=Y
R=arv@chromium.org, dslomov@chromium.org

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

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

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

AUTHORS
src/v8natives.js
test/mjsunit/third_party/object-keys.js
test/test262/test262.status

diff --git a/AUTHORS b/AUTHORS
index bb14936..d406a6c 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -27,6 +27,7 @@ Andreas Anyuru <andreas.anyuru@gmail.com>
 Baptiste Afsa <baptiste.afsa@arm.com>
 Bert Belder <bertbelder@gmail.com>
 Burcu Dogan <burcujdogan@gmail.com>
+Caitlin Potter <caitpotter88@gmail.com>
 Craig Schlenter <craig.schlenter@gmail.com>
 Chunyang Dai <chunyang.dai@intel.com>
 Daniel Andersson <kodandersson@gmail.com>
index 5adbca2..1d2e030 100644 (file)
@@ -325,9 +325,7 @@ function ObjectLookupSetter(name) {
 
 
 function ObjectKeys(obj) {
-  if (!IS_SPEC_OBJECT(obj)) {
-    throw MakeTypeError("called_on_non_object", ["Object.keys"]);
-  }
+  obj = ToObject(obj);
   if (%IsJSProxy(obj)) {
     var handler = %GetHandler(obj);
     var names = CallTrap0(handler, "keys", DerivedKeysTrap);
index d09265c..c800374 100644 (file)
@@ -31,8 +31,8 @@
 
 // Based on LayoutTests/fast/js/Object-keys.html
 
-assertThrows(function () { Object.keys(2) }, TypeError);
-assertThrows(function () { Object.keys("foo") }, TypeError);
+assertEquals(Object.keys(2), []);
+assertEquals(Object.keys("foo"), ["0", "1", "2"]);
 assertThrows(function () { Object.keys(null) }, TypeError);
 assertThrows(function () { Object.keys(undefined) }, TypeError);
 
index 8666313..8dd90f5 100644 (file)
   'S15.9.3.1_A5_T5': [PASS, FAIL_OK],
   'S15.9.3.1_A5_T6': [PASS, FAIL_OK],
 
+  # ObjectKeys() no longer throws TypeError when passed a primitive value which
+  # is not null or undefined (per ES6).
+  '15.2.3.14-1-1': [SKIP],
+  '15.2.3.14-1-2': [SKIP],
+  '15.2.3.14-1-3': [SKIP],
+
   ############################ SKIPPED TESTS #############################
 
   # These tests take a looong time to run in debug mode.