diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-05-23 12:32:52 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-05-23 17:52:56 +0000 |
commit | 5f23a667ef493f4dbaf7054bfda341b7a7d79609 (patch) | |
tree | 6599df71fa755a9ffec8df17f1c3c05e306290dd /src/qml/jsruntime/qv4objectproto.cpp | |
parent | 3de014db9ebdaa66d875bb8801261e39846ae5d0 (diff) |
Implement Object.setPrototypeOf()
Change-Id: I4488ea4855a52bc7fd386d2eec8c35def83f2785
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4objectproto.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4objectproto.cpp | 25 |
1 files changed, 25 insertions, 0 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(); |