[ES6] Implement Reflect.preventExtensions
[WebKit-https.git] / Source / JavaScriptCore / runtime / ReflectObject.cpp
index a64b7c0fea8f2942467b3973a33e4216cbca51c6..19c31ab863d013a91ae3b526ff73106532b8c022 100644 (file)
 
 #include "JSCInlines.h"
 #include "Lookup.h"
+#include "ObjectConstructor.h"
+
+namespace JSC {
+
+static EncodedJSValue JSC_HOST_CALL reflectObjectIsExtensible(ExecState*);
+static EncodedJSValue JSC_HOST_CALL reflectObjectOwnKeys(ExecState*);
+static EncodedJSValue JSC_HOST_CALL reflectObjectPreventExtensions(ExecState*);
+
+}
 
 #include "ReflectObject.lut.h"
 
@@ -39,8 +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
+    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
 */
 
@@ -62,4 +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::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