aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqml.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-02-08 12:14:21 +0100
committerUlf Hermann <ulf.hermann@qt.io>2023-02-08 21:15:12 +0100
commitf69b6f0940b178b46ecbaa5f0b4956ac44e8379e (patch)
tree1ca60786e29205166be5c8381c66da88fed6f85d /src/qml/qml/qqml.cpp
parentac5bbbe4aca5e1abef4972aeeba22c8c2f923705 (diff)
QML: Fortify qmlExecuteDeferred some more
I don't know how to trigger this, but a recent crash report from the CI shows that we can get there without a valid engine. Pick-to: 6.5 Change-Id: I9f17894da82b8e7eab88181c96dfa8eaf7795523 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqml.cpp')
-rw-r--r--src/qml/qml/qqml.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/qml/qml/qqml.cpp b/src/qml/qml/qqml.cpp
index 6140a532f1..13654d0cb0 100644
--- a/src/qml/qml/qqml.cpp
+++ b/src/qml/qml/qqml.cpp
@@ -50,17 +50,23 @@ void qmlExecuteDeferred(QObject *object)
{
QQmlData *data = QQmlData::get(object);
- if (data && !data->deferredData.isEmpty() && !data->wasDeleted(object)) {
- QQmlEnginePrivate *ep = QQmlEnginePrivate::get(data->context->engine());
+ if (!data
+ || !data->context
+ || !data->context->engine()
+ || data->deferredData.isEmpty()
+ || data->wasDeleted(object)) {
+ return;
+ }
- QQmlComponentPrivate::DeferredState state;
- QQmlComponentPrivate::beginDeferred(ep, object, &state);
+ QQmlEnginePrivate *ep = QQmlEnginePrivate::get(data->context->engine());
- // Release the reference for the deferral action (we still have one from construction)
- data->releaseDeferredData();
+ QQmlComponentPrivate::DeferredState state;
+ QQmlComponentPrivate::beginDeferred(ep, object, &state);
- QQmlComponentPrivate::completeDeferred(ep, &state);
- }
+ // Release the reference for the deferral action (we still have one from construction)
+ data->releaseDeferredData();
+
+ QQmlComponentPrivate::completeDeferred(ep, &state);
}
QQmlContext *qmlContext(const QObject *obj)