diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-12-12 15:20:09 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-08 14:51:52 +0100 |
commit | a9bef84675f6b67bb88a2bb99e45aba889795251 (patch) | |
tree | adb12c994b3b2db0ee9a34e48ff755576ecf22bc /src/qml/qml | |
parent | fb377763ac3eea4010c7a501b8363ca46874a5b3 (diff) |
[new compiler] Cleanups
Move the code that calls the main compilation passes into a separate
QQmlTypeCompiler class, away from the QQmlTypeLoader.
Change-Id: Ia2f33a074d7fe7d9a092ff94d1e6cfc961ad5bdb
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqmltypeloader.cpp | 175 | ||||
-rw-r--r-- | src/qml/qml/qqmltypeloader_p.h | 5 |
2 files changed, 9 insertions, 171 deletions
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index 5b6d91475b..9e23b0b1a5 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -52,6 +52,7 @@ #include <private/qqmlprofilerservice_p.h> #include <private/qqmlmemoryprofiler_p.h> #include <private/qqmlcodegenerator_p.h> +#include <private/qqmltypecompiler_p.h> #include <QtCore/qdir.h> #include <QtCore/qfile.h> @@ -2306,177 +2307,9 @@ void QQmlTypeData::compile() QQmlCompilingProfiler prof(m_compiledData->name); if (m_useNewCompiler) { - m_compiledData->importCache = new QQmlTypeNameCache; - - foreach (const QString &ns, m_namespaces) - m_compiledData->importCache->add(ns); - - // Add any Composite Singletons that were used to the import cache - for (int i = 0; i < compositeSingletons().count(); ++i) { - m_compiledData->importCache->add(compositeSingletons().at(i).type->qmlTypeName(), - compositeSingletons().at(i).type->sourceUrl(), compositeSingletons().at(i).prefix); - } - - m_imports.populateCache(m_compiledData->importCache); - m_compiledData->importCache->addref(); - - QQmlEngine *engine = typeLoader()->engine(); - QQmlEnginePrivate *enginePrivate = QQmlEnginePrivate::get(engine); - - for (QHash<int, TypeReference>::ConstIterator resolvedType = m_resolvedTypes.constBegin(), end = m_resolvedTypes.constEnd(); - resolvedType != end; ++resolvedType) { - QQmlCompiledData::TypeReference ref; - if (resolvedType->typeData) { - ref.component = resolvedType->typeData->compiledData(); - ref.component->addref(); - } else { - ref.type = resolvedType->type; - Q_ASSERT(ref.type); - } - ref.majorVersion = resolvedType->majorVersion; - ref.minorVersion = resolvedType->minorVersion; - m_compiledData->resolvedTypes.insert(resolvedType.key(), ref); - } - - // Build property caches and VME meta object data - - const int objectCount = parsedQML->objects.count(); - m_compiledData->datas.reserve(objectCount); - m_compiledData->propertyCaches.reserve(objectCount); - - QQmlPropertyCacheCreator propertyCacheBuilder(enginePrivate, - parsedQML->jsGenerator.strings, m_compiledData->url, - &m_imports, &m_compiledData->resolvedTypes); - - for (int i = 0; i < objectCount; ++i) { - const QtQml::QmlObject *obj = parsedQML->objects.at(i); - - QByteArray vmeMetaObjectData; - QQmlPropertyCache *propertyCache = 0; - - // If the object has no type, then it's probably a nested object definition as part - // of a group property. - const bool objectHasType = !propertyCacheBuilder.stringAt(obj->inheritedTypeNameIndex).isEmpty(); - if (objectHasType) { - if (!propertyCacheBuilder.create(obj, &propertyCache, &vmeMetaObjectData)) { - setError(propertyCacheBuilder.errors); - m_compiledData->release(); - m_compiledData = 0; - return; - } - } - - m_compiledData->datas << vmeMetaObjectData; - if (propertyCache) - propertyCache->addref(); - m_compiledData->propertyCaches << propertyCache; - - if (i == parsedQML->indexOfRootObject) { - Q_ASSERT(propertyCache); - m_compiledData->rootPropertyCache = propertyCache; - propertyCache->addref(); - } - } - - { - SignalHandlerConverter converter(QQmlEnginePrivate::get(engine), - parsedQML.data(), - m_compiledData); - if (!converter.convertSignalHandlerExpressionsToFunctionDeclarations()) { - setError(converter.errors); - m_compiledData->release(); - m_compiledData = 0; - return; - } - } - - // Collect imported scripts - m_compiledData->scripts.reserve(m_scripts.count()); - for (int scriptIndex = 0; scriptIndex < m_scripts.count(); ++scriptIndex) { - const ScriptReference &script = m_scripts.at(scriptIndex); - - QString qualifier = script.qualifier; - QString enclosingNamespace; - - const int lastDotIndex = qualifier.lastIndexOf(QLatin1Char('.')); - if (lastDotIndex != -1) { - enclosingNamespace = qualifier.left(lastDotIndex); - qualifier = qualifier.mid(lastDotIndex+1); - } - - m_compiledData->importCache->add(qualifier, scriptIndex, enclosingNamespace); - QQmlScriptData *scriptData = script.script->scriptData(); - scriptData->addref(); - m_compiledData->scripts << scriptData; - } - - // Compile JS binding expressions and signal handlers - - JSCodeGen jsCodeGen(finalUrlString(), parsedQML->code, &parsedQML->jsModule, &parsedQML->jsParserEngine, parsedQML->program, m_compiledData->importCache); - const QVector<int> runtimeFunctionIndices = jsCodeGen.generateJSCodeForFunctionsAndBindings(parsedQML->functions); - - QV4::ExecutionEngine *v4 = QV8Engine::getV4(m_typeLoader->engine()); - - QScopedPointer<QQmlJS::EvalInstructionSelection> isel(v4->iselFactory->create(enginePrivate, v4->executableAllocator, &parsedQML->jsModule, &parsedQML->jsGenerator)); - isel->setUseFastLookups(false); - QV4::CompiledData::CompilationUnit *jsUnit = isel->compile(/*generated unit data*/false); - - // Generate QML compiled type data structures - - QmlUnitGenerator qmlGenerator; - QV4::CompiledData::QmlUnit *qmlUnit = qmlGenerator.generate(*parsedQML.data(), runtimeFunctionIndices); - - if (jsUnit) { - Q_ASSERT(!jsUnit->data); - jsUnit->ownsData = false; - jsUnit->data = &qmlUnit->header; - } - - m_compiledData->compilationUnit = jsUnit; - if (m_compiledData->compilationUnit) - m_compiledData->compilationUnit->ref(); - m_compiledData->qmlUnit = qmlUnit; // ownership transferred to m_compiledData - - QList<QQmlError> errors; - - // Resolve component boundaries and aliases - - { - // Scan for components, determine their scopes and resolve aliases within the scope. - QQmlComponentAndAliasResolver resolver(m_compiledData->url, m_compiledData->qmlUnit, m_compiledData->resolvedTypes, m_compiledData->propertyCaches, - &m_compiledData->datas, &m_compiledData->objectIndexToIdForRoot, &m_compiledData->objectIndexToIdPerComponent); - if (!resolver.resolve()) - errors << resolver.errors; - } - - if (errors.isEmpty()) { - // Add to type registry of composites - if (m_compiledData->isCompositeType()) - QQmlEnginePrivate::get(engine)->registerInternalCompositeType(m_compiledData); - else { - const QV4::CompiledData::Object *obj = qmlUnit->objectAt(qmlUnit->indexOfRootObject); - QQmlCompiledData::TypeReference typeRef = m_compiledData->resolvedTypes.value(obj->inheritedTypeNameIndex); - if (typeRef.component) { - m_compiledData->metaTypeId = typeRef.component->metaTypeId; - m_compiledData->listMetaTypeId = typeRef.component->listMetaTypeId; - } else { - m_compiledData->metaTypeId = typeRef.type->typeId(); - m_compiledData->listMetaTypeId = typeRef.type->qListTypeId(); - } - } - } - - // Sanity check property bindings - if (errors.isEmpty()) { - QQmlPropertyValidator validator(m_compiledData->url, m_compiledData->qmlUnit, m_compiledData->resolvedTypes, - m_compiledData->propertyCaches, m_compiledData->objectIndexToIdPerComponent, - &m_compiledData->customParserData); - if (!validator.validate()) - errors << validator.errors; - } - - if (!errors.isEmpty()) { - setError(errors); + QQmlTypeCompiler compiler(QQmlEnginePrivate::get(typeLoader()->engine()), m_compiledData, this, parsedQML.data()); + if (!compiler.compile()) { + setError(compiler.errors); m_compiledData->release(); m_compiledData = 0; } diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index b93cf2942d..a022162a7c 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -425,7 +425,12 @@ public: const QQmlScript::Parser &parser() const; + // old compiler: const QList<TypeReference> &resolvedTypes() const; + // new compiler: + const QHash<int, TypeReference> &resolvedTypeRefs() const { return m_resolvedTypes; } + // --- + const QList<ScriptReference> &resolvedScripts() const; const QSet<QString> &namespaces() const; const QList<TypeReference> &compositeSingletons() const; |