aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/qml/qqmlcomponent.cpp31
-rw-r--r--src/qml/qml/qqmlcomponent_p.h18
-rw-r--r--src/qml/types/qqmlbind.cpp14
-rw-r--r--src/quicktemplates2/qquickdeferredexecute.cpp10
-rw-r--r--tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp13
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));