From 94a675cc7c2b90374d307fbeb70e590b7c5a733d Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Tue, 24 Sep 2019 10:37:43 +0200 Subject: QQmlDelegateModel: Fix QQmlDelegateModelItem::dataForObject With required properties, we do not store the cache item as a context object anymore. To fix this, we repurpose the (space of the) incubator pointer of QQmlContextData to store the element there, and one of the dummy bits as a flag to indicate the new usage. Change-Id: I7cc435fc6781c603fe407411a60a6018239c972c Reviewed-by: Ulf Hermann --- src/qml/qml/qqmlcontext.cpp | 2 +- src/qml/qml/qqmlcontext_p.h | 11 ++++++++--- src/qml/qml/qqmlincubator.cpp | 5 +++-- 3 files changed, 12 insertions(+), 6 deletions(-) (limited to 'src/qml/qml') diff --git a/src/qml/qml/qqmlcontext.cpp b/src/qml/qml/qqmlcontext.cpp index 14892bd6ad..668f00b136 100644 --- a/src/qml/qml/qqmlcontext.cpp +++ b/src/qml/qml/qqmlcontext.cpp @@ -550,7 +550,7 @@ QQmlContextData::QQmlContextData() QQmlContextData::QQmlContextData(QQmlContext *ctxt) : engine(nullptr), isInternal(false), isJSContext(false), isPragmaLibraryContext(false), unresolvedNames(false), hasEmittedDestruction(false), isRootObjectInCreation(false), - stronglyReferencedByParent(false), publicContext(ctxt), incubator(nullptr), componentObjectIndex(-1), + stronglyReferencedByParent(false), hasExtraObject(false), publicContext(ctxt), incubator(nullptr), componentObjectIndex(-1), contextObject(nullptr), nextChild(nullptr), prevChild(nullptr), expressions(nullptr), contextObjects(nullptr), idValues(nullptr), idValueCount(0), componentAttached(nullptr) diff --git a/src/qml/qml/qqmlcontext_p.h b/src/qml/qml/qqmlcontext_p.h index 5f7316b00c..f93393a11b 100644 --- a/src/qml/qml/qqmlcontext_p.h +++ b/src/qml/qml/qqmlcontext_p.h @@ -147,11 +147,16 @@ public: quint32 hasEmittedDestruction:1; quint32 isRootObjectInCreation:1; quint32 stronglyReferencedByParent:1; - quint32 dummy:25; + quint32 hasExtraObject:1; // used in QQmlDelegateModelItem::dataForObject to find the corresponding QQmlDelegateModelItem of an object + quint32 dummy:24; QQmlContext *publicContext; - // The incubator that is constructing this context if any - QQmlIncubatorPrivate *incubator; + union { + // The incubator that is constructing this context if any + QQmlIncubatorPrivate *incubator; + // a pointer to extra data, currently only used in QQmlDelegateModel + QObject *extraObject; + }; // Compilation unit for contexts that belong to a compiled type. QQmlRefPointer typeCompilationUnit; diff --git a/src/qml/qml/qqmlincubator.cpp b/src/qml/qml/qqmlincubator.cpp index 5c3ecbfb60..f0ef5360b0 100644 --- a/src/qml/qml/qqmlincubator.cpp +++ b/src/qml/qml/qqmlincubator.cpp @@ -61,7 +61,7 @@ void QQmlEnginePrivate::incubate(QQmlIncubator &i, QQmlContextData *forContext) QExplicitlySharedDataPointer parentIncubator; QQmlContextData *cctxt = forContext; while (cctxt) { - if (cctxt->incubator) { + if (!cctxt->hasExtraObject && cctxt->incubator) { parentIncubator = cctxt->incubator; break; } @@ -149,7 +149,8 @@ void QQmlIncubatorPrivate::clear() } enginePriv = nullptr; if (!rootContext.isNull()) { - rootContext->incubator = nullptr; + if (!rootContext->hasExtraObject) + rootContext->incubator = nullptr; rootContext = nullptr; } -- cgit v1.2.3