diff options
author | Maximilian Goldstein <max.goldstein@qt.io> | 2021-02-09 14:29:24 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-02-22 14:20:19 +0000 |
commit | 0c029b420ea9b7631cf87d427c0821320064c01b (patch) | |
tree | 2f4a5fec2d7d135caa64df3cdb1619668288ecc2 /src/qml/jsruntime/qv4qmlcontext.cpp | |
parent | 911191793f10b6c160b282b98e7cf585103ca47c (diff) |
Fix QJSValue singletons only supporting object types
Now primitives such as integers and strings should also work.
Fixes: QTBUG-85615
Change-Id: I201d1844b7272ca50e32f1e33e9ac357b5e68dfe
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
(cherry picked from commit 64102ae231317eb6f637304918e55153dadef72d)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/qml/jsruntime/qv4qmlcontext.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4qmlcontext.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/qml/jsruntime/qv4qmlcontext.cpp b/src/qml/jsruntime/qv4qmlcontext.cpp index ec3aa00341..5581ea9a53 100644 --- a/src/qml/jsruntime/qv4qmlcontext.cpp +++ b/src/qml/jsruntime/qv4qmlcontext.cpp @@ -240,15 +240,22 @@ ReturnedValue QQmlContextWrapper::getPropertyAndBase(const QQmlContextWrapper *r QQmlEnginePrivate *e = QQmlEnginePrivate::get(v4->qmlEngine()); if (r.type.isQObjectSingleton() || r.type.isCompositeSingleton()) { e->singletonInstance<QObject*>(r.type); - lookup->qmlContextSingletonLookup.singleton = - static_cast<Heap::Object*>( + lookup->qmlContextSingletonLookup.singletonObject = Value::fromReturnedValue( QQmlTypeWrapper::create(v4, nullptr, r.type) - ).heapObject()); + ).heapObject(); } else { QJSValue singleton = e->singletonInstance<QJSValue>(r.type); - QV4::ScopedObject o(scope, QJSValuePrivate::asReturnedValue(&singleton)); - lookup->qmlContextSingletonLookup.singleton = o->d(); + + // QSrting values should already have been put on the engine heap at this point + // to manage their memory. We later assume this has already happened. + Q_ASSERT(!QJSValuePrivate::asQString(&singleton)); + + if (QV4::Value *val = QJSValuePrivate::takeManagedValue(&singleton)) { + lookup->qmlContextSingletonLookup.singletonObject = val->heapObject(); + } else { + lookup->qmlContextSingletonLookup.singletonValue = QJSValuePrivate::asReturnedValue(&singleton); + } } lookup->qmlContextPropertyGetter = QQmlContextWrapper::lookupSingleton; return lookup->qmlContextPropertyGetter(lookup, v4, base); @@ -539,7 +546,11 @@ ReturnedValue QQmlContextWrapper::lookupSingleton(Lookup *l, ExecutionEngine *en { Q_UNUSED(engine); Q_UNUSED(base); - return Value::fromHeapObject(l->qmlContextSingletonLookup.singleton).asReturnedValue(); + + if (l->qmlContextSingletonLookup.singletonObject != nullptr) + return l->qmlContextSingletonLookup.singletonObject->asReturnedValue(); + + return l->qmlContextSingletonLookup.singletonValue; } ReturnedValue QQmlContextWrapper::lookupIdObject(Lookup *l, ExecutionEngine *engine, Value *base) |