// 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); QQmlIncubator::IncubationMode mode = i.incubationMode(); if (!incubationController) mode = QQmlIncubator::Synchronous; if (mode == QQmlIncubator::AsynchronousIfNested) { mode = QQmlIncubator::Synchronous; // Need to find the first constructing context and see if it is asynchronous QExplicitlySharedDataPointer<QQmlIncubatorPrivate> parentIncubator; QQmlContextData *cctxt = forContext; while (cctxt) { if (cctxt->activeVMEData) { parentIncubator = (QQmlIncubatorPrivate *)cctxt->activeVMEData; break; } cctxt = cctxt->parent; } if (parentIncubator && parentIncubator->isAsynchronous) { mode = QQmlIncubator::Asynchronous; p->waitingOnMe = parentIncubator; parentIncubator->waitingFor.insert(p.data()); } } p->isAsynchronous = (mode != QQmlIncubator::Synchronous); inProgressCreations++; if (mode == QQmlIncubator::Synchronous) { QRecursionWatcher<QQmlIncubatorPrivate, &QQmlIncubatorPrivate::recursion> watcher(p.data()); p->changeStatus(QQmlIncubator::Loading); if (!watcher.hasRecursed()) { QQmlInstantiationInterrupt i; p->incubate(i); } } else { incubatorList.insert(p.data()); incubatorCount++; p->vmeGuard.guard(p->creator.data()); p->changeStatus(QQmlIncubator::Loading); if (incubationController) incubationController->incubatingObjectCountChanged(incubatorCount); } }
void QQmlIncubatorPrivate::clear() { if (next.isInList()) { next.remove(); Q_ASSERT(compiledData); QQmlEnginePrivate *enginePriv = QQmlEnginePrivate::get(compiledData->engine); compiledData->release(); compiledData = 0; enginePriv->incubatorCount--; QQmlIncubationController *controller = enginePriv->incubationController; if (controller) controller->incubatingObjectCountChanged(enginePriv->incubatorCount); } else if (compiledData) { compiledData->release(); compiledData = 0; } if (!rootContext.isNull()) { rootContext->activeVMEData = 0; rootContext = 0; } if (nextWaitingFor.isInList()) { Q_ASSERT(waitingOnMe); nextWaitingFor.remove(); waitingOnMe = 0; } // if we're waiting on any incubators then they should be cleared too. while (waitingFor.first()) { QQmlIncubator * i = static_cast<QQmlIncubatorPrivate*>(waitingFor.first())->q; if (i) i->clear(); } bool guardOk = vmeGuard.isOK(); vmeGuard.clear(); if (creator && guardOk) creator->clear(); creator.reset(0); }
static PyObject *meth_QQmlIncubator_forceCompletion(PyObject *sipSelf, PyObject *sipArgs) { PyObject *sipParseErr = NULL; { QQmlIncubator *sipCpp; if (sipParseArgs(&sipParseErr, sipArgs, "B", &sipSelf, sipType_QQmlIncubator, &sipCpp)) { sipCpp->forceCompletion(); Py_INCREF(Py_None); return Py_None; } } /* Raise an exception if the arguments couldn't be parsed. */ sipNoMethod(sipParseErr, sipName_QQmlIncubator, sipName_forceCompletion, doc_QQmlIncubator_forceCompletion); return NULL; }