aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4objectproto.cpp25
-rw-r--r--src/qml/jsruntime/qv4objectproto_p.h1
-rw-r--r--tests/auto/qml/ecmascripttests/TestExpectations5
3 files changed, 26 insertions, 5 deletions
diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp
index 363b53a336..0752c992f3 100644
--- a/src/qml/jsruntime/qv4objectproto.cpp
+++ b/src/qml/jsruntime/qv4objectproto.cpp
@@ -108,6 +108,7 @@ void ObjectPrototype::init(ExecutionEngine *v4, Object *ctor)
ctor->defineDefaultProperty(QStringLiteral("isFrozen"), method_isFrozen, 1);
ctor->defineDefaultProperty(QStringLiteral("isExtensible"), method_isExtensible, 1);
ctor->defineDefaultProperty(QStringLiteral("keys"), method_keys, 1);
+ ctor->defineDefaultProperty(QStringLiteral("setPrototypeOf"), method_setPrototypeOf, 2);
defineDefaultProperty(QStringLiteral("constructor"), (o = ctor));
defineDefaultProperty(v4->id_toString(), method_toString, 0);
@@ -473,6 +474,30 @@ ReturnedValue ObjectPrototype::method_keys(const FunctionObject *b, const Value
return a.asReturnedValue();
}
+ReturnedValue ObjectPrototype::method_setPrototypeOf(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ Scope scope(f->engine());
+ if (argc < 2 || argv[0].isNullOrUndefined() || !(argv[1].isObject() || argv[1].isNull()))
+ return scope.engine->throwTypeError();
+
+ if (!argv[0].isObject())
+ return argv[0].asReturnedValue();
+
+ ScopedObject o(scope, argv[0]);
+ ScopedObject p(scope, argv[1]);
+ Q_ASSERT(!!o);
+
+ if (o->prototype() != p->d()) {
+ bool ok = false;
+ if (o->isExtensible()) {
+ ok = o->setPrototype(p);
+ }
+ if (!ok)
+ return scope.engine->throwTypeError(QStringLiteral("Object.setPrototypeOf: Could not change prototype"));
+ }
+ return o->asReturnedValue();
+}
+
ReturnedValue ObjectPrototype::method_toString(const FunctionObject *b, const Value *thisObject, const Value *, int)
{
ExecutionEngine *v4 = b->engine();
diff --git a/src/qml/jsruntime/qv4objectproto_p.h b/src/qml/jsruntime/qv4objectproto_p.h
index 2b231d46ad..57aff87643 100644
--- a/src/qml/jsruntime/qv4objectproto_p.h
+++ b/src/qml/jsruntime/qv4objectproto_p.h
@@ -92,6 +92,7 @@ struct ObjectPrototype: Object
static ReturnedValue method_isFrozen(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
static ReturnedValue method_isExtensible(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
static ReturnedValue method_keys(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_setPrototypeOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
static ReturnedValue method_toLocaleString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations
index 0aacea491d..2aa71d7559 100644
--- a/tests/auto/qml/ecmascripttests/TestExpectations
+++ b/tests/auto/qml/ecmascripttests/TestExpectations
@@ -1027,12 +1027,7 @@ built-ins/Object/prototype/toString/symbol-tag-override-instances.js fails
built-ins/Object/prototype/toString/symbol-tag-override-primitives.js fails
built-ins/Object/prototype/toString/symbol-tag-str.js fails
built-ins/Object/prototype/valueOf/S15.2.4.4_A14.js fails
-built-ins/Object/setPrototypeOf/length.js fails
-built-ins/Object/setPrototypeOf/name.js fails
-built-ins/Object/setPrototypeOf/o-not-obj.js fails
-built-ins/Object/setPrototypeOf/property-descriptor.js fails
built-ins/Object/setPrototypeOf/set-error.js fails
-built-ins/Object/setPrototypeOf/success.js fails
built-ins/Object/values/exception-during-enumeration.js fails
built-ins/Object/values/function-length.js fails
built-ins/Object/values/function-name.js fails