[ES6] Implement Reflect.preventExtensions
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 28 Jul 2015 04:23:57 +0000 (04:23 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 28 Jul 2015 04:23:57 +0000 (04:23 +0000)
https://bugs.webkit.org/show_bug.cgi?id=147331

Reviewed by Sam Weinig.

Implement Reflect.preventExtensions.
This is different from Object.preventExensions.

1. When preventExtensions is called onto the non-object, it raises the TypeError.
2. Reflect.preventExtensions does not raise the TypeError when the preventExtensions operation is failed.

For the (2) case, since there is no Proxy implementation currently, Reflect.preventExtensions always succeed.

* runtime/ReflectObject.cpp:
(JSC::reflectObjectPreventExtensions):
* tests/stress/reflect-prevent-extensions.js: Added.
(shouldBe):
(shouldThrow):

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

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

index b5c33c0..60d82b5 100644 (file)
@@ -1,3 +1,24 @@
+2015-07-27  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [ES6] Implement Reflect.preventExtensions
+        https://bugs.webkit.org/show_bug.cgi?id=147331
+
+        Reviewed by Sam Weinig.
+
+        Implement Reflect.preventExtensions.
+        This is different from Object.preventExensions.
+
+        1. When preventExtensions is called onto the non-object, it raises the TypeError.
+        2. Reflect.preventExtensions does not raise the TypeError when the preventExtensions operation is failed.
+
+        For the (2) case, since there is no Proxy implementation currently, Reflect.preventExtensions always succeed.
+
+        * runtime/ReflectObject.cpp:
+        (JSC::reflectObjectPreventExtensions):
+        * tests/stress/reflect-prevent-extensions.js: Added.
+        (shouldBe):
+        (shouldThrow):
+
 2015-07-27  Alex Christensen  <achristensen@webkit.org>
 
         Use Ninja on Windows.
index e935463..19c31ab 100644 (file)
 
 namespace JSC {
 
-static EncodedJSValue JSC_HOST_CALL reflectObjectOwnKeys(ExecState*);
-
-}
-
-namespace JSC {
-
 static EncodedJSValue JSC_HOST_CALL reflectObjectIsExtensible(ExecState*);
+static EncodedJSValue JSC_HOST_CALL reflectObjectOwnKeys(ExecState*);
+static EncodedJSValue JSC_HOST_CALL reflectObjectPreventExtensions(ExecState*);
 
 }
 
@@ -52,10 +48,11 @@ const ClassInfo ReflectObject::s_info = { "Reflect", &Base::s_info, &reflectObje
 
 /* Source for ReflectObject.lut.h
 @begin reflectObjectTable
-    apply           reflectObjectApply          DontEnum|Function 3
-    deleteProperty  reflectObjectDeleteProperty DontEnum|Function 2
-    isExtensible    reflectObjectIsExtensible   DontEnum|Function 1
-    ownKeys         reflectObjectOwnKeys        DontEnum|Function 1
+    apply             reflectObjectApply             DontEnum|Function 3
+    deleteProperty    reflectObjectDeleteProperty    DontEnum|Function 2
+    isExtensible      reflectObjectIsExtensible      DontEnum|Function 1
+    ownKeys           reflectObjectOwnKeys           DontEnum|Function 1
+    preventExtensions reflectObjectPreventExtensions DontEnum|Function 1
 @end
 */
 
@@ -93,4 +90,13 @@ EncodedJSValue JSC_HOST_CALL reflectObjectOwnKeys(ExecState* exec)
     return JSValue::encode(ownPropertyKeys(exec, jsCast<JSObject*>(target), PropertyNameMode::StringsAndSymbols, DontEnumPropertiesMode::Include));
 }
 
+EncodedJSValue JSC_HOST_CALL reflectObjectPreventExtensions(ExecState* exec)
+{
+    JSValue target = exec->argument(0);
+    if (!target.isObject())
+        return JSValue::encode(throwTypeError(exec, ASCIILiteral("Reflect.preventExtensions requires the first argument be an object")));
+    asObject(target)->preventExtensions(exec->vm());
+    return JSValue::encode(jsBoolean(true));
+}
+
 } // namespace JSC
diff --git a/Source/JavaScriptCore/tests/stress/reflect-prevent-extensions.js b/Source/JavaScriptCore/tests/stress/reflect-prevent-extensions.js
new file mode 100644 (file)
index 0000000..4c5606c
--- /dev/null
@@ -0,0 +1,31 @@
+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.preventExtensions.length, 1);
+
+shouldThrow(() => {
+    Reflect.preventExtensions("hello");
+}, `TypeError: Reflect.preventExtensions requires the first argument be an object`);
+
+var object = { hello: 42 };
+shouldBe(Reflect.isExtensible(object), true);
+shouldBe(Reflect.preventExtensions(object), true);
+shouldBe(Reflect.isExtensible(object), false);
+
+object.ok = 42;
+shouldBe(object.hasOwnProperty('ok'), false);