diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-10-04 02:37:53 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-08 10:04:35 +0100 |
commit | 4a662c21e669e964f9c3b835a91a38c9decf4ad4 (patch) | |
tree | a3921e3303336b59b59aba386dcf683cc241d087 /src | |
parent | 4b9a44274563b8cc0a9d98f86893df3f31f01307 (diff) |
[new compiler] Preliminary support for QQmlIncubator
Just enough to run some unit tests that use QQuickLoader, components are
created instantly.
Change-Id: I1c827aa946d3e2a60ccc220bb79572aca2ed8c96
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/qml/qqmlcomponent.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmlincubator.cpp | 17 | ||||
-rw-r--r-- | src/qml/qml/qqmlincubator_p.h | 5 | ||||
-rw-r--r-- | src/qml/qml/qqmlobjectcreator.cpp | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmlobjectcreator_p.h | 3 | ||||
-rw-r--r-- | src/qml/types/qqmldelegatemodel.cpp | 15 |
6 files changed, 44 insertions, 10 deletions
diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index 21bcd3569c..5813415347 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -1056,7 +1056,11 @@ void QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context, p->compiledData = d->cc; p->compiledData->addref(); - p->vme.init(contextData, d->cc, d->start, d->creationContext); + if (enginePriv->useNewCompiler) { + p->creator.reset(new QmlObjectCreator(contextData, d->cc)); + p->subComponentToCreate = d->start; + } else + p->vme.init(contextData, d->cc, d->start, d->creationContext); enginePriv->incubate(incubator, forContextData); } diff --git a/src/qml/qml/qqmlincubator.cpp b/src/qml/qml/qqmlincubator.cpp index ade4634c2d..52bf1d8b3e 100644 --- a/src/qml/qml/qqmlincubator.cpp +++ b/src/qml/qml/qqmlincubator.cpp @@ -46,6 +46,7 @@ #include "qqmlcompiler_p.h" #include "qqmlexpression_p.h" #include "qqmlmemoryprofiler_p.h" +#include "qqmlobjectcreator_p.h" // XXX TODO // - check that the Component.onCompleted behavior is the same as 4.8 in the synchronous and @@ -292,7 +293,14 @@ void QQmlIncubatorPrivate::incubate(QQmlVME::Interrupt &i) if (progress == QQmlIncubatorPrivate::Execute) { enginePriv->referenceScarceResources(); - QObject *tresult = vme.execute(&errors, i); + QObject *tresult = 0; + if (enginePriv->useNewCompiler) { + tresult = creator->create(subComponentToCreate); + if (!tresult) + errors = creator->errors; + } else { + tresult = vme.execute(&errors, i); + } enginePriv->dereferenceScarceResources(); if (watcher.hasRecursed()) @@ -335,7 +343,11 @@ void QQmlIncubatorPrivate::incubate(QQmlVME::Interrupt &i) if (watcher.hasRecursed()) return; - QQmlContextData *ctxt = vme.complete(i); + QQmlContextData *ctxt = 0; + if (enginePriv->useNewCompiler) + ctxt = creator->finalize(); + else + ctxt = vme.complete(i); if (ctxt) { rootContext = ctxt; progress = QQmlIncubatorPrivate::Completed; @@ -566,6 +578,7 @@ void QQmlIncubator::clear() d->vme.reset(); d->vmeGuard.clear(); + d->creator.reset(0); Q_ASSERT(d->compiledData == 0); Q_ASSERT(d->waitingOnMe.data() == 0); diff --git a/src/qml/qml/qqmlincubator_p.h b/src/qml/qml/qqmlincubator_p.h index e7246ce3b2..a8b549bd28 100644 --- a/src/qml/qml/qqmlincubator_p.h +++ b/src/qml/qml/qqmlincubator_p.h @@ -88,7 +88,12 @@ public: QPointer<QObject> result; QQmlGuardedContextData rootContext; QQmlCompiledData *compiledData; + // --- old compiler QQmlVME vme; + // --- new compiler + QScopedPointer<QmlObjectCreator> creator; + int subComponentToCreate; + // --- QQmlVMEGuard vmeGuard; QExplicitlySharedDataPointer<QQmlIncubatorPrivate> waitingOnMe; diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index 7455a486db..822708a73e 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -478,6 +478,7 @@ QmlObjectCreator::QmlObjectCreator(QQmlContextData *parentContext, QQmlCompiledD , propertyCaches(compiledData->propertyCaches) , vmeMetaObjectData(compiledData->datas) , compiledData(compiledData) + , rootContext(0) , _qobject(0) , _qobjectForBindings(0) , _valueTypeProperty(0) @@ -512,6 +513,9 @@ QObject *QmlObjectCreator::create(int subComponentIndex, QObject *parent) context->imports->addref(); context->setParent(parentContext); + if (!rootContext) + rootContext = context; + QVector<QQmlContextData::ObjectIdMapping> mapping(objectIndexToId.count()); for (QHash<int, int>::ConstIterator it = objectIndexToId.constBegin(), end = objectIndexToId.constEnd(); it != end; ++it) { @@ -1312,7 +1316,7 @@ QObject *QmlObjectCreator::createInstance(int index, QObject *parent) return instance; } -void QmlObjectCreator::finalize() +QQmlContextData *QmlObjectCreator::finalize() { { QQmlTrace trace("VME Binding Enable"); @@ -1377,6 +1381,8 @@ void QmlObjectCreator::finalize() #endif } } + + return rootContext; } bool QmlObjectCreator::populateInstance(int index, QObject *instance, QQmlRefPointer<QQmlPropertyCache> cache, diff --git a/src/qml/qml/qqmlobjectcreator_p.h b/src/qml/qml/qqmlobjectcreator_p.h index 799329d8de..229a7de198 100644 --- a/src/qml/qml/qqmlobjectcreator_p.h +++ b/src/qml/qml/qqmlobjectcreator_p.h @@ -143,7 +143,7 @@ public: QmlObjectCreator(QQmlContextData *contextData, QQmlCompiledData *compiledData); QObject *create(int subComponentIndex = -1, QObject *parent = 0); - void finalize(); + QQmlContextData *finalize(); QQmlComponentAttached *componentAttached; QList<QQmlEnginePrivate::FinalizeCallback> finalizeCallbacks; @@ -170,6 +170,7 @@ private: QLinkedList<QVector<QQmlAbstractBinding*> > allCreatedBindings; QLinkedList<QVector<QQmlParserStatus*> > allParserStatusCallbacks; QQmlCompiledData *compiledData; + QQmlContextData *rootContext; QObject *_qobject; QObject *_qobjectForBindings; diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp index 7276c0e5c6..32ebb93279 100644 --- a/src/qml/types/qqmldelegatemodel.cpp +++ b/src/qml/types/qqmldelegatemodel.cpp @@ -1863,11 +1863,16 @@ void QQmlDelegateModelItem::incubateObject( incubatorPriv->compiledData = componentPriv->cc; incubatorPriv->compiledData->addref(); - incubatorPriv->vme.init( - context, - componentPriv->cc, - componentPriv->start, - componentPriv->creationContext); + if (enginePriv->useNewCompiler) { + incubatorPriv->creator.reset(new QmlObjectCreator(context, componentPriv->cc)); + incubatorPriv->subComponentToCreate = componentPriv->start; + } else { + incubatorPriv->vme.init( + context, + componentPriv->cc, + componentPriv->start, + componentPriv->creationContext); + } enginePriv->incubate(*incubationTask, forContext); } |