[ES6] Implement Reflect.preventExtensions
[WebKit-https.git] / Source / JavaScriptCore / runtime / ReflectObject.cpp
index 86b77611e021b750486c02a16e46a0d7fba6df60..19c31ab863d013a91ae3b526ff73106532b8c022 100644 (file)
@@ -32,7 +32,9 @@
 
 namespace JSC {
 
+static EncodedJSValue JSC_HOST_CALL reflectObjectIsExtensible(ExecState*);
 static EncodedJSValue JSC_HOST_CALL reflectObjectOwnKeys(ExecState*);
+static EncodedJSValue JSC_HOST_CALL reflectObjectPreventExtensions(ExecState*);
 
 }
 
@@ -46,9 +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
-    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
 */
 
@@ -70,12 +74,29 @@ 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);
     if (!target.isObject())
         return JSValue::encode(throwTypeError(exec, ASCIILiteral("Reflect.ownKeys requires the first argument be an object")));
-    return JSValue::encode(ownPropertyKeys(exec, jsCast<JSObject*>(target), PropertyNameMode::Both, DontEnumPropertiesMode::Include));
+    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