- if (!exec->argument(0).isObject())
- return throwVMError(exec, createTypeError(exec, ASCIILiteral("Requested prototype of a value that is not an object.")));
- JSObject* object = asObject(exec->argument(0));
- if (!object->allowsAccessFrom(exec->trueCallerFrame()))
+ JSObject* object = exec->argument(0).toObject(exec);
+ if (exec->hadException())
+ return JSValue::encode(jsNull());
+ ObjectConstructorGetPrototypeOfFunctor functor(object);
+ exec->iterate(functor);
+ return functor.result();
+}
+
+EncodedJSValue JSC_HOST_CALL objectConstructorSetPrototypeOf(ExecState* exec)
+{
+ JSValue objectValue = exec->argument(0);
+ if (objectValue.isUndefinedOrNull())
+ return throwVMTypeError(exec);
+
+ JSValue protoValue = exec->argument(1);
+ if (!protoValue.isObject() && !protoValue.isNull())
+ return throwVMTypeError(exec);
+
+ JSObject* object = objectValue.toObject(exec);
+ if (exec->hadException())
+ return JSValue::encode(objectValue);
+
+ if (!checkProtoSetterAccessAllowed(exec, object))
+ return JSValue::encode(objectValue);
+
+ if (!object->isExtensible())
+ return throwVMError(exec, createTypeError(exec, StrictModeReadonlyPropertyWriteError));
+
+ if (!object->setPrototypeWithCycleCheck(exec, protoValue)) {
+ exec->vm().throwException(exec, createError(exec, ASCIILiteral("cyclic __proto__ value")));