diff options
-rw-r--r-- | src/qml/qml/qqmlcomponent.cpp | 31 | ||||
-rw-r--r-- | src/qml/qml/qqmlcomponent_p.h | 18 | ||||
-rw-r--r-- | src/qml/types/qqmlbind.cpp | 14 | ||||
-rw-r--r-- | src/quicktemplates2/qquickdeferredexecute.cpp | 10 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 13 |
5 files changed, 51 insertions, 35 deletions
diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index 288aa730b1..2a284a6bf9 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -308,13 +308,13 @@ void QQmlComponentPrivate::fromTypeData(const QQmlRefPointer<QQmlTypeData> &data RequiredProperties &QQmlComponentPrivate::requiredProperties() { - Q_ASSERT(state.creator); - return state.creator->requiredProperties(); + Q_ASSERT(state.hasCreator()); + return state.creator()->requiredProperties(); } bool QQmlComponentPrivate::hadTopLevelRequiredProperties() const { - return state.creator->componentHadTopLevelRequiredProperties(); + return state.creator()->componentHadTopLevelRequiredProperties(); } void QQmlComponentPrivate::clear() @@ -413,7 +413,7 @@ QQmlComponent::~QQmlComponent() } // we might not have the creator anymore if the engine is gone - if (d->state.creator) + if (d->state.hasCreator()) d->completeCreate(); } @@ -539,7 +539,7 @@ QQmlComponent::QQmlComponent(QQmlEngine *engine, QObject *parent) Q_D(QQmlComponent); d->engine = engine; QObject::connect(engine, &QObject::destroyed, this, [d]() { - d->state.creator.reset(); + d->state.clear(); d->engine = nullptr; }); } @@ -1004,7 +1004,7 @@ QObject *QQmlComponentPrivate::beginCreate(QQmlRefPointer<QQmlContextData> conte return e.isTransient; }), state.errors.end()); - if (state.creator) + if (state.hasCreator()) requiredProperties().clear(); if (!q->isReady()) { @@ -1029,10 +1029,10 @@ QObject *QQmlComponentPrivate::beginCreate(QQmlRefPointer<QQmlContextData> conte if (!loadedType.isValid()) { enginePriv->referenceScarceResources(); - state.creator.reset(new QQmlObjectCreator(std::move(context), compilationUnit, creationContext)); - rv = state.creator->create(start); + state.initCreator(std::move(context), compilationUnit, creationContext); + rv = state.creator()->create(start); if (!rv) - state.appendErrors(state.creator->errors); + state.appendErrors(state.creator()->errors); enginePriv->dereferenceScarceResources(); } else { rv = loadedType.createWithQQmlData(); @@ -1065,12 +1065,13 @@ void QQmlComponentPrivate::beginDeferred(QQmlEnginePrivate *enginePriv, ConstructionState state; state.completePending = true; - state.creator.reset(new QQmlObjectCreator( - deferredData->context->parent(), deferredData->compilationUnit, - QQmlRefPointer<QQmlContextData>())); + auto creator = state.initCreator( + deferredData->context->parent(), + deferredData->compilationUnit, + QQmlRefPointer<QQmlContextData>()); - if (!state.creator->populateDeferredProperties(object, deferredData)) - state.appendErrors(state.creator->errors); + if (!creator->populateDeferredProperties(object, deferredData)) + state.appendErrors(creator->errors); deferredData->bindings.clear(); deferredState->push_back(std::move(state)); @@ -1087,7 +1088,7 @@ void QQmlComponentPrivate::complete(QQmlEnginePrivate *enginePriv, ConstructionS { if (state->completePending) { QQmlInstantiationInterrupt interrupt; - state->creator->finalize(interrupt); + state->creator()->finalize(interrupt); state->completePending = false; diff --git a/src/qml/qml/qqmlcomponent_p.h b/src/qml/qml/qqmlcomponent_p.h index b2444605aa..c6b30cf2f5 100644 --- a/src/qml/qml/qqmlcomponent_p.h +++ b/src/qml/qml/qqmlcomponent_p.h @@ -90,7 +90,6 @@ public: }; struct ConstructionState { - std::unique_ptr<QQmlObjectCreator> creator; QList<AnnotatedQmlError> errors; bool completePending = false; @@ -99,6 +98,23 @@ public: for (const QQmlError &e : qmlErrors) errors.emplaceBack(e); } + + QQmlObjectCreator *creator() {return m_creator.get(); } + const QQmlObjectCreator *creator() const {return m_creator.get(); } + bool hasCreator() const { return m_creator != nullptr; } + void clear() { m_creator.reset(); } + QQmlObjectCreator *initCreator(QQmlRefPointer<QQmlContextData> parentContext, + const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit, + const QQmlRefPointer<QQmlContextData> &creationContext) + { + m_creator.reset(new QQmlObjectCreator( + std::move(parentContext), compilationUnit, + creationContext)); + return m_creator.get(); + } + + private: + std::unique_ptr<QQmlObjectCreator> m_creator; }; ConstructionState state; diff --git a/src/qml/types/qqmlbind.cpp b/src/qml/types/qqmlbind.cpp index a01622f25f..fb9a9d2221 100644 --- a/src/qml/types/qqmlbind.cpp +++ b/src/qml/types/qqmlbind.cpp @@ -759,14 +759,14 @@ void QQmlBindPrivate::decodeBinding( QQmlProperty property(q, propertyName); if (property.isValid()) { - if (!immediateState->creator) { + if (!immediateState->hasCreator()) { immediateState->completePending = true; - immediateState->creator = std::make_unique<QQmlObjectCreator>( + immediateState->initCreator( deferredData->context->parent(), deferredData->compilationUnit, contextData); - immediateState->creator->beginPopulateDeferred(deferredData->context); + immediateState->creator()->beginPopulateDeferred(deferredData->context); } - immediateState->creator->populateDeferredBinding( + immediateState->creator()->populateDeferredBinding( property, deferredData->deferredIdx, binding); } else { qmlWarning(q).nospace() << "Unknown name " << propertyName @@ -882,10 +882,10 @@ void QQmlBindPrivate::buildBindEntries(QQmlBind *q, QQmlComponentPrivate::Deferr decodeBinding(q, QString(), deferredData, *it, &constructionState); - if (constructionState.creator.get()) { + if (constructionState.hasCreator()) { ++ep->inProgressCreations; - constructionState.creator->finalizePopulateDeferred(); - constructionState.appendErrors(constructionState.creator->errors); + constructionState.creator()->finalizePopulateDeferred(); + constructionState.appendErrors(constructionState.creator()->errors); deferredState->push_back(std::move(constructionState)); } } else { diff --git a/src/quicktemplates2/qquickdeferredexecute.cpp b/src/quicktemplates2/qquickdeferredexecute.cpp index 2e593bc6be..63f33d01e6 100644 --- a/src/quicktemplates2/qquickdeferredexecute.cpp +++ b/src/quicktemplates2/qquickdeferredexecute.cpp @@ -45,17 +45,17 @@ static bool beginDeferred(QQmlEnginePrivate *enginePriv, const QQmlProperty &pro state.completePending = true; QQmlContextData *creationContext = nullptr; - state.creator.reset(new QQmlObjectCreator(deferData->context->parent(), deferData->compilationUnit, creationContext)); + state.initCreator(deferData->context->parent(), deferData->compilationUnit, creationContext); enginePriv->inProgressCreations++; std::deque<const QV4::CompiledData::Binding *> reversedBindings; std::copy(range.first, range.second, std::front_inserter(reversedBindings)); - state.creator->beginPopulateDeferred(deferData->context); + state.creator()->beginPopulateDeferred(deferData->context); for (const QV4::CompiledData::Binding *binding : reversedBindings) - state.creator->populateDeferredBinding(property, deferData->deferredIdx, binding); - state.creator->finalizePopulateDeferred(); - state.appendErrors(state.creator->errors); + state.creator()->populateDeferredBinding(property, deferData->deferredIdx, binding); + state.creator()->finalizePopulateDeferred(); + state.appendErrors(state.creator()->errors); deferredState->push_back(std::move(state)); diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 29703e0cb5..598c73da86 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -5066,19 +5066,18 @@ static void beginDeferredOnce(QQmlEnginePrivate *enginePriv, QQmlComponentPrivate::ConstructionState state; state.completePending = true; - state.creator.reset(new QQmlObjectCreator( - deferData->context->parent(), deferData->compilationUnit, - QQmlRefPointer<QQmlContextData>())); + state.initCreator(deferData->context->parent(), deferData->compilationUnit, + QQmlRefPointer<QQmlContextData>()); enginePriv->inProgressCreations++; std::deque<const QV4::CompiledData::Binding *> reversedBindings; std::copy(range.first, range.second, std::front_inserter(reversedBindings)); - state.creator->beginPopulateDeferred(deferData->context); + state.creator()->beginPopulateDeferred(deferData->context); for (const QV4::CompiledData::Binding *binding: reversedBindings) - state.creator->populateDeferredBinding(property, deferData->deferredIdx, binding); - state.creator->finalizePopulateDeferred(); - state.appendErrors(state.creator->errors); + state.creator()->populateDeferredBinding(property, deferData->deferredIdx, binding); + state.creator()->finalizePopulateDeferred(); + state.appendErrors(state.creator()->errors); deferredState->push_back(std::move(state)); |