aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmltypeloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/qml/qqmltypeloader.cpp')
-rw-r--r--src/qml/qml/qqmltypeloader.cpp176
1 files changed, 7 insertions, 169 deletions
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp
index 6eda55e35b..278bb017d0 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>
@@ -2154,8 +2155,9 @@ void QQmlTypeData::dataReceived(const Data &data)
if (data.isFile()) preparseData = data.asFile()->metaData(QLatin1String("qml:preparse"));
if (m_useNewCompiler) {
- parsedQML.reset(new QtQml::ParsedQML(QV8Engine::getV4(typeLoader()->engine())->debugger != 0));
- QQmlCodeGenerator compiler;
+ QQmlEngine *qmlEngine = typeLoader()->engine();
+ parsedQML.reset(new QtQml::ParsedQML(QV8Engine::getV4(qmlEngine)->debugger != 0));
+ QQmlCodeGenerator compiler(QV8Engine::get(qmlEngine)->illegalNames());
if (!compiler.generateFromQml(code, finalUrl(), finalUrlString(), parsedQML.data())) {
setError(compiler.errors);
return;
@@ -2305,173 +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);
- }
-
- {
- 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;
-
- // Build property caches and VME meta object data
-
- m_compiledData->datas.reserve(qmlUnit->nObjects);
- m_compiledData->propertyCaches.reserve(qmlUnit->nObjects);
-
- QQmlPropertyCacheCreator propertyCacheBuilder(enginePrivate,
- qmlUnit, m_compiledData->url,
- &m_imports, &m_compiledData->resolvedTypes);
-
- for (quint32 i = 0; i < qmlUnit->nObjects; ++i) {
- const QV4::CompiledData::Object *obj = qmlUnit->objectAt(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 = !parsedQML->jsGenerator.strings.at(obj->inheritedTypeNameIndex).isEmpty();
- if (objectHasType) {
- if (!propertyCacheBuilder.create(obj, &propertyCache, &vmeMetaObjectData)) {
- errors << propertyCacheBuilder.errors;
- break;
- }
- }
-
- m_compiledData->datas << vmeMetaObjectData;
- if (propertyCache)
- propertyCache->addref();
- m_compiledData->propertyCaches << propertyCache;
-
- if (i == qmlUnit->indexOfRootObject) {
- Q_ASSERT(propertyCache);
- m_compiledData->rootPropertyCache = propertyCache;
- propertyCache->addref();
- }
- }
-
- // Resolve component boundaries and aliases
-
- if (errors.isEmpty()) {
- // 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);
- 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.compilationErrors());
m_compiledData->release();
m_compiledData = 0;
}