diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-01-23 10:03:00 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-01-27 10:42:06 +0100 |
commit | ddba87612d2be25863135669e81bc3391dc40e82 (patch) | |
tree | 839f35beafff47adeb1df12d2958cf8f36e9704a /src/qml/qml/qqml.cpp | |
parent | 08c086b9977d9275c53b58d6ffc766740e248c2c (diff) |
QML: Turn singleton/type mismatch into a run time type error
There are many ways to "hide" the qmldir from the engine at run time,
which turns singletons into regular types. While all of this is invalid,
we should not assert on it, but rather produce a legible warning.
Furthermore, sharpen the importing of extra modules from qrc as implicit
imports. We should really only import modules the file in question can
ever be part of. Otherwise we needlessly produce the above situation and
hide legitimate warning messages.
Amends commit 7517c1b3ae9aa92f36b19d74a4b2de5e8531309b.
Now we need to teach our tools about the default import paths in the
resorurce file system. They cannot guess any type they may find in any
resource file anymore.
Pick-to: 6.5
Task-number: QTBUG-106929
Change-Id: Ic8c02396d10830a7f461e8a81649bb8c9a1add1f
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Diffstat (limited to 'src/qml/qml/qqml.cpp')
-rw-r--r-- | src/qml/qml/qqml.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/qml/qml/qqml.cpp b/src/qml/qml/qqml.cpp index 07aea5e553..c752adc5a0 100644 --- a/src/qml/qml/qqml.cpp +++ b/src/qml/qml/qqml.cpp @@ -1573,8 +1573,19 @@ static void initTypeWrapperLookup( } scope.engine->throwTypeError(); } else { - l->qmlContextPropertyGetter(l, context->engine->handle(), nullptr); - Q_ASSERT(l->qmlContextPropertyGetter == qmlContextPropertyGetter); + QV4::ExecutionEngine *v4 = context->engine->handle(); + l->qmlContextPropertyGetter(l, v4, nullptr); + if (l->qmlContextPropertyGetter != qmlContextPropertyGetter) { + const QString error + = QLatin1String(qmlContextPropertyGetter + == QV4::QQmlContextWrapper::lookupSingleton + ? "%1 was a singleton at compile time, " + "but is not a singleton anymore." + : "%1 was not a singleton at compile time, " + "but is a singleton now.") + .arg(context->compilationUnit->runtimeStrings[l->nameIndex]->toQString()); + v4->throwTypeError(error); + } } } |