diff options
Diffstat (limited to 'src/qml/qml/qqmlincubator.cpp')
-rw-r--r-- | src/qml/qml/qqmlincubator.cpp | 83 |
1 files changed, 30 insertions, 53 deletions
diff --git a/src/qml/qml/qqmlincubator.cpp b/src/qml/qml/qqmlincubator.cpp index 54d0b240f5..39da550d63 100644 --- a/src/qml/qml/qqmlincubator.cpp +++ b/src/qml/qml/qqmlincubator.cpp @@ -45,9 +45,6 @@ #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 -// async if nested cases void QQmlEnginePrivate::incubate(QQmlIncubator &i, QQmlContextData *forContext) { QExplicitlySharedDataPointer<QQmlIncubatorPrivate> p(i.d); @@ -64,8 +61,8 @@ void QQmlEnginePrivate::incubate(QQmlIncubator &i, QQmlContextData *forContext) QExplicitlySharedDataPointer<QQmlIncubatorPrivate> parentIncubator; QQmlContextData *cctxt = forContext; while (cctxt) { - if (cctxt->activeVMEData) { - parentIncubator = (QQmlIncubatorPrivate *)cctxt->activeVMEData; + if (cctxt->incubator) { + parentIncubator = cctxt->incubator; break; } cctxt = cctxt->parent; @@ -113,7 +110,7 @@ void QQmlEngine::setIncubationController(QQmlIncubationController *controller) { Q_D(QQmlEngine); if (d->incubationController) - d->incubationController->d = 0; + d->incubationController->d = nullptr; d->incubationController = controller; if (controller) controller->d = d; } @@ -131,7 +128,7 @@ QQmlIncubationController *QQmlEngine::incubationController() const QQmlIncubatorPrivate::QQmlIncubatorPrivate(QQmlIncubator *q, QQmlIncubator::IncubationMode m) : q(q), status(QQmlIncubator::Null), mode(m), isAsynchronous(false), progress(Execute), - result(0), enginePriv(0), waitingOnMe(0) + result(nullptr), enginePriv(nullptr), waitingOnMe(nullptr) { } @@ -150,16 +147,16 @@ void QQmlIncubatorPrivate::clear() if (controller) controller->incubatingObjectCountChanged(enginePriv->incubatorCount); } - enginePriv = 0; + enginePriv = nullptr; if (!rootContext.isNull()) { - rootContext->activeVMEData = 0; - rootContext = 0; + rootContext->incubator = nullptr; + rootContext = nullptr; } if (nextWaitingFor.isInList()) { Q_ASSERT(waitingOnMe); nextWaitingFor.remove(); - waitingOnMe = 0; + waitingOnMe = nullptr; } // if we're waiting on any incubators then they should be cleared too. @@ -174,12 +171,12 @@ void QQmlIncubatorPrivate::clear() vmeGuard.clear(); if (creator && guardOk) creator->clear(); - creator.reset(0); + creator.reset(nullptr); } /*! \class QQmlIncubationController -\brief QQmlIncubationController instances drive the progress of QQmlIncubators +\brief QQmlIncubationController instances drive the progress of QQmlIncubators. \inmodule QtQml In order to behave asynchronously and not introduce stutters or freezes in an application, @@ -221,15 +218,15 @@ than a static amount like 5 milliseconds - while not disturbing the application. Create a new incubation controller. */ QQmlIncubationController::QQmlIncubationController() -: d(0) +: d(nullptr) { } /*! \internal */ QQmlIncubationController::~QQmlIncubationController() { - if (d) QQmlEnginePrivate::get(d)->setIncubationController(0); - d = 0; + if (d) QQmlEnginePrivate::get(d)->setIncubationController(nullptr); + d = nullptr; } /*! @@ -275,7 +272,7 @@ void QQmlIncubatorPrivate::incubate(QQmlInstantiationInterrupt &i) if (!compilationUnit) return; - QML_MEMORY_SCOPE_URL(compilationUnit->url()); + QML_MEMORY_SCOPE_URL(compilationUnit->finalUrl()); QExplicitlySharedDataPointer<QQmlIncubatorPrivate> protectThis(this); @@ -285,8 +282,9 @@ void QQmlIncubatorPrivate::incubate(QQmlInstantiationInterrupt &i) if (!vmeGuard.isOK()) { QQmlError error; + error.setMessageType(QtInfoMsg); error.setUrl(compilationUnit->url()); - error.setDescription(QQmlComponent::tr("Object destroyed during incubation")); + error.setDescription(QQmlComponent::tr("Object or context destroyed during incubation")); errors << error; progress = QQmlIncubatorPrivate::Completed; @@ -297,8 +295,8 @@ void QQmlIncubatorPrivate::incubate(QQmlInstantiationInterrupt &i) if (progress == QQmlIncubatorPrivate::Execute) { enginePriv->referenceScarceResources(); - QObject *tresult = 0; - tresult = creator->create(subComponentToCreate, /*parent*/0, &i); + QObject *tresult = nullptr; + tresult = creator->create(subComponentToCreate, /*parent*/nullptr, &i); if (!tresult) errors = creator->errors; enginePriv->dereferenceScarceResources(); @@ -307,7 +305,7 @@ void QQmlIncubatorPrivate::incubate(QQmlInstantiationInterrupt &i) return; result = tresult; - if (errors.isEmpty() && result == 0) + if (errors.isEmpty() && result == nullptr) goto finishIncubate; if (result) { @@ -343,7 +341,7 @@ void QQmlIncubatorPrivate::incubate(QQmlInstantiationInterrupt &i) if (watcher.hasRecursed()) return; - QQmlContextData *ctxt = 0; + QQmlContextData *ctxt = nullptr; ctxt = creator->finalize(i); if (ctxt) { rootContext = ctxt; @@ -370,33 +368,14 @@ finishIncubate: enginePriv->inProgressCreations--; if (0 == enginePriv->inProgressCreations) { - while (enginePriv->erroredBindings) { - enginePriv->warning(enginePriv->erroredBindings); - enginePriv->erroredBindings->removeError(); - } + while (enginePriv->erroredBindings) + enginePriv->warning(enginePriv->erroredBindings->removeError()); } } else if (!creator.isNull()) { vmeGuard.guard(creator.data()); } } -void QQmlIncubatorPrivate::cancel(QObject *object, QQmlContext *context) -{ - if (!context) - context = qmlContext(object); - if (!context) - return; - - QQmlContextData *data = QQmlContextData::get(context); - QQmlIncubatorPrivate *p = (QQmlIncubatorPrivate *)data->activeVMEData; - if (!p) - return; - - p->vmeGuard.unguard(object); - if (!p->creator.isNull()) - p->creator->cancel(object); -} - /*! Incubate objects for \a msecs, or until there are no more objects to incubate. */ @@ -526,12 +505,12 @@ QQmlIncubator::QQmlIncubator(IncubationMode mode) /*! \internal */ QQmlIncubator::~QQmlIncubator() { - d->q = 0; + d->q = nullptr; if (!d->ref.deref()) { delete d; } - d = 0; + d = nullptr; } /*! @@ -577,28 +556,26 @@ void QQmlIncubator::clear() if (s == Loading) { Q_ASSERT(d->compilationUnit); if (d->result) d->result->deleteLater(); - d->result = 0; + d->result = nullptr; } d->clear(); Q_ASSERT(d->compilationUnit.isNull()); - Q_ASSERT(d->waitingOnMe.data() == 0); + Q_ASSERT(d->waitingOnMe.data() == nullptr); Q_ASSERT(d->waitingFor.isEmpty()); d->errors.clear(); d->progress = QQmlIncubatorPrivate::Execute; - d->result = 0; + d->result = nullptr; if (s == Loading) { Q_ASSERT(enginePriv); enginePriv->inProgressCreations--; if (0 == enginePriv->inProgressCreations) { - while (enginePriv->erroredBindings) { - enginePriv->warning(enginePriv->erroredBindings); - enginePriv->erroredBindings->removeError(); - } + while (enginePriv->erroredBindings) + enginePriv->warning(enginePriv->erroredBindings->removeError()); } } @@ -677,7 +654,7 @@ Return the incubated object if the status is Ready, otherwise 0. QObject *QQmlIncubator::object() const { if (status() != Ready) - return 0; + return nullptr; else return d->result; } |