diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-07-29 12:49:37 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-07-29 12:49:37 +0200 |
commit | 8b88e37bf79a53eb0cb34226aacb25ad9b01d7cf (patch) | |
tree | 6087ee08b55f69f9c4981d9026d3162f2ee50c31 /src/qml/qml/qqmlobjectcreator.cpp | |
parent | 61edb86ed4cc0ac31d77d3793936fa1e8476b504 (diff) | |
parent | 7ceca6ac0535a957e9f87f789119c288f6d93837 (diff) |
Merge remote-tracking branch 'origin/5.3' into dev
Change-Id: Id95f7b01de36bccecbb7b73acc041654a1fe2ebe
Diffstat (limited to 'src/qml/qml/qqmlobjectcreator.cpp')
-rw-r--r-- | src/qml/qml/qqmlobjectcreator.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index 9501b705ba..72920f1ae2 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -96,6 +96,7 @@ QQmlObjectCreator::QQmlObjectCreator(QQmlContextData *parentContext, QQmlCompile sharedState->allCreatedBindings.allocate(compiledData->totalBindingsCount); sharedState->allParserStatusCallbacks.allocate(compiledData->totalParserStatusCount); sharedState->allCreatedObjects.allocate(compiledData->totalObjectCount); + sharedState->allJavaScriptObjects = 0; sharedState->creationContext = creationContext; sharedState->rootContext = 0; @@ -195,6 +196,13 @@ QObject *QQmlObjectCreator::create(int subComponentIndex, QObject *parent, QQmlI sharedState->rootContext->isRootObjectInCreation = true; } + QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); + QV4::Scope scope(v4); + + Q_ASSERT(sharedState->allJavaScriptObjects || topLevelCreator); + if (topLevelCreator) + sharedState->allJavaScriptObjects = scope.alloc(compiledData->totalObjectCount); + QVector<QQmlContextData::ObjectIdMapping> mapping(objectIndexToId.count()); for (QHash<int, int>::ConstIterator it = objectIndexToId.constBegin(), end = objectIndexToId.constEnd(); it != end; ++it) { @@ -208,8 +216,6 @@ QObject *QQmlObjectCreator::create(int subComponentIndex, QObject *parent, QQmlI context->setIdPropertyData(mapping); if (subComponentIndex == -1) { - QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); - QV4::Scope scope(v4); QV4::ScopedObject scripts(scope, v4->newArrayObject(compiledData->scripts.count())); context->importedScripts = scripts; for (int i = 0; i < compiledData->scripts.count(); ++i) { @@ -230,6 +236,9 @@ QObject *QQmlObjectCreator::create(int subComponentIndex, QObject *parent, QQmlI ddata->compiledData->addref(); } + if (topLevelCreator) + sharedState->allJavaScriptObjects = 0; + phase = CreatingObjectsPhase2; if (interrupt && interrupt->shouldInterrupt()) @@ -258,8 +267,11 @@ bool QQmlObjectCreator::populateDeferredProperties(QObject *instance) QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); QV4::Scope valueScope(v4); - QV4::ScopedValue scopeObjectProtector(valueScope, declarativeData->jsWrapper.value()); - Q_UNUSED(scopeObjectProtector); + + Q_ASSERT(topLevelCreator); + Q_ASSERT(!sharedState->allJavaScriptObjects); + sharedState->allJavaScriptObjects = valueScope.alloc(compiledData->totalObjectCount); + QV4::ScopedObject qmlScope(valueScope, QV4::QmlContextWrapper::qmlScope(QV8Engine::get(engine), context, _scopeObject)); QV4::Scoped<QV4::QmlBindingWrapper> qmlBindingWrapper(valueScope, v4->memoryManager->alloc<QV4::QmlBindingWrapper>(v4->rootContext, qmlScope)); QV4::ExecutionContext *qmlContext = qmlBindingWrapper->context(); @@ -1159,9 +1171,12 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo qSwap(_scopeObject, scopeObject); QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); + + Q_ASSERT(sharedState->allJavaScriptObjects); + QV4::ValueRef ref = QV4::ValueRef::fromRawValue(sharedState->allJavaScriptObjects++); + ref = QV4::QObjectWrapper::wrap(v4, instance); + QV4::Scope valueScope(v4); - QV4::ScopedValue scopeObjectProtector(valueScope, ddata ? ddata->jsWrapper.value() : 0); - Q_UNUSED(scopeObjectProtector); QV4::ScopedObject qmlScope(valueScope, QV4::QmlContextWrapper::qmlScope(QV8Engine::get(engine), context, _scopeObject)); QV4::Scoped<QV4::QmlBindingWrapper> qmlBindingWrapper(valueScope, v4->memoryManager->alloc<QV4::QmlBindingWrapper>(v4->rootContext, qmlScope)); QV4::ExecutionContext *qmlContext = qmlBindingWrapper->context(); |