[ES6] Implement Reflect.isExtensible
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 26 Jul 2015 21:17:32 +0000 (21:17 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 26 Jul 2015 21:17:32 +0000 (21:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=147308

Reviewed by Sam Weinig.

This patch implements Reflect.isExtensible.
It is similar to Object.isExtensible.
The difference is that it raises an error if the first argument is not an object.

* runtime/ReflectObject.cpp:
(JSC::reflectObjectIsExtensible):
* tests/stress/reflect-is-extensible.js: Added.
(shouldBe):
(shouldThrow):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@187410 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ReflectObject.cpp
Source/JavaScriptCore/tests/stress/reflect-is-extensible.js [new file with mode: 0644]

index 5966bb1..6ef5b54 100644 (file)
@@ -1,5 +1,22 @@
 2015-07-26  Yusuke Suzuki  <utatane.tea@gmail.com>
 
+        [ES6] Implement Reflect.isExtensible
+        https://bugs.webkit.org/show_bug.cgi?id=147308
+
+        Reviewed by Sam Weinig.
+
+        This patch implements Reflect.isExtensible.
+        It is similar to Object.isExtensible.
+        The difference is that it raises an error if the first argument is not an object.
+
+        * runtime/ReflectObject.cpp:
+        (JSC::reflectObjectIsExtensible):
+        * tests/stress/reflect-is-extensible.js: Added.
+        (shouldBe):
+        (shouldThrow):
+
+2015-07-26  Yusuke Suzuki  <utatane.tea@gmail.com>
+
         Unreviewed, fix the debug build due to touching the non-declared variable in ASSERT
         https://bugs.webkit.org/show_bug.cgi?id=147307
 
index 86b7761..0e30d9f 100644 (file)
@@ -36,6 +36,12 @@ static EncodedJSValue JSC_HOST_CALL reflectObjectOwnKeys(ExecState*);
 
 }
 
+namespace JSC {
+
+static EncodedJSValue JSC_HOST_CALL reflectObjectIsExtensible(ExecState*);
+
+}
+
 #include "ReflectObject.lut.h"
 
 namespace JSC {
@@ -48,6 +54,7 @@ const ClassInfo ReflectObject::s_info = { "Reflect", &Base::s_info, &reflectObje
 @begin reflectObjectTable
     apply           reflectObjectApply          DontEnum|Function 3
     deleteProperty  reflectObjectDeleteProperty DontEnum|Function 2
+    isExtensible    reflectObjectIsExtensible   DontEnum|Function 1
     ownKeys         reflectObjectOwnKeys        DontEnum|Function 1
 @end
 */
@@ -70,6 +77,14 @@ bool ReflectObject::getOwnPropertySlot(JSObject* object, ExecState* exec, Proper
 
 // ------------------------------ Functions --------------------------------
 
+EncodedJSValue JSC_HOST_CALL reflectObjectIsExtensible(ExecState* exec)
+{
+    JSValue target = exec->argument(0);
+    if (!target.isObject())
+        return JSValue::encode(throwTypeError(exec, ASCIILiteral("Reflect.isExtensible requires the first argument be an object")));
+    return JSValue::encode(jsBoolean(asObject(target)->isExtensible()));
+}
+
 EncodedJSValue JSC_HOST_CALL reflectObjectOwnKeys(ExecState* exec)
 {
     JSValue target = exec->argument(0);
diff --git a/Source/JavaScriptCore/tests/stress/reflect-is-extensible.js b/Source/JavaScriptCore/tests/stress/reflect-is-extensible.js
new file mode 100644 (file)
index 0000000..9d2581c
--- /dev/null
@@ -0,0 +1,28 @@
+function shouldBe(actual, expected) {
+    if (actual !== expected)
+        throw new Error('bad value: ' + actual);
+}
+
+function shouldThrow(func, message) {
+    var error = null;
+    try {
+        func();
+    } catch (e) {
+        error = e;
+    }
+    if (!error)
+        throw new Error("not thrown.");
+    if (String(error) !== message)
+        throw new Error("bad error: " + String(error));
+}
+
+shouldBe(Reflect.isExtensible.length, 1);
+
+shouldThrow(() => {
+    Reflect.isExtensible("hello");
+}, `TypeError: Reflect.isExtensible requires the first argument be an object`);
+
+var object = { hello: 42 };
+shouldBe(Reflect.isExtensible(object), true);
+Object.preventExtensions(object);
+shouldBe(Reflect.isExtensible(object), false);