diff options
Diffstat (limited to 'src/qml/compiler/qqmlirbuilder.cpp')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 101 |
1 files changed, 51 insertions, 50 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index bd0aedf089..e85703e9aa 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -188,12 +188,12 @@ void Object::insertSorted(Binding *b) bindings->insertAfter(insertionPoint, b); } -QStringList Signal::parameterStringList(const QStringList &stringPool) const +QStringList Signal::parameterStringList(const QV4::Compiler::StringTableGenerator *stringPool) const { QStringList result; result.reserve(parameters->count); for (SignalParameter *param = parameters->first; param; param = param->next) - result << stringPool.at(param->nameIndex); + result << stringPool->stringForIndex(param->nameIndex); return result; } @@ -259,6 +259,32 @@ static inline bool isUriToken(int token) return false; } +void Document::collectTypeReferences() +{ + foreach (Object *obj, objects) { + if (obj->inheritedTypeNameIndex != emptyStringIndex) { + QV4::CompiledData::TypeReference &r = typeReferences.add(obj->inheritedTypeNameIndex, obj->location); + r.needsCreation = true; + r.errorWhenNotFound = true; + } + + for (const Property *prop = obj->firstProperty(); prop; prop = prop->next) { + if (prop->type >= QV4::CompiledData::Property::Custom) { + // ### FIXME: We could report the more accurate location here by using prop->location, but the old + // compiler can't and the tests expect it to be the object location right now. + QV4::CompiledData::TypeReference &r = typeReferences.add(prop->customTypeNameIndex, obj->location); + r.needsCreation = true; + r.errorWhenNotFound = true; + } + } + + for (const Binding *binding = obj->firstBinding(); binding; binding = binding->next) { + if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) + typeReferences.add(binding->propertyNameIndex, binding->location); + } + } +} + void Document::extractScriptMetaData(QString &script, QQmlError *error) { Q_ASSERT(error); @@ -504,6 +530,15 @@ void Document::removeScriptPragmas(QString &script) } } +Document::Document(bool debugMode) + : jsModule(debugMode) + , program(0) + , jsGenerator(&jsModule, sizeof(QV4::CompiledData::QmlUnit)) + , unitFlags(0) + , javaScriptCompilationUnit(0) +{ +} + IRBuilder::IRBuilder(const QSet<QString> &illegalNames) : illegalNames(illegalNames) , _object(0) @@ -546,7 +581,6 @@ bool IRBuilder::generateFromQml(const QString &code, const QUrl &url, const QStr qSwap(_imports, output->imports); qSwap(_pragmas, output->pragmas); qSwap(_objects, output->objects); - qSwap(_typeReferences, output->typeReferences); this->pool = output->jsParserEngine.pool(); this->jsGenerator = &output->jsGenerator; @@ -565,13 +599,11 @@ bool IRBuilder::generateFromQml(const QString &code, const QUrl &url, const QStr QQmlJS::AST::UiObjectDefinition *rootObject = QQmlJS::AST::cast<QQmlJS::AST::UiObjectDefinition*>(program->members->member); Q_ASSERT(rootObject); - if (defineQMLObject(&output->indexOfRootObject, rootObject)) - collectTypeReferences(); + defineQMLObject(&output->indexOfRootObject, rootObject); qSwap(_imports, output->imports); qSwap(_pragmas, output->pragmas); qSwap(_objects, output->objects); - qSwap(_typeReferences, output->typeReferences); return errors.isEmpty(); } @@ -789,10 +821,10 @@ bool IRBuilder::visit(QQmlJS::AST::UiImport *node) // Check for script qualifier clashes bool isScript = import->type == QV4::CompiledData::Import::ImportScript; for (int ii = 0; ii < _imports.count(); ++ii) { - QV4::CompiledData::Import *other = _imports.at(ii); + const QV4::CompiledData::Import *other = _imports.at(ii); bool otherIsScript = other->type == QV4::CompiledData::Import::ImportScript; - if ((isScript || otherIsScript) && qualifier == jsGenerator->strings.at(other->qualifierIndex)) { + if ((isScript || otherIsScript) && qualifier == jsGenerator->stringForIndex(other->qualifierIndex)) { recordError(node->importIdToken, QCoreApplication::translate("QQmlParser","Script import qualifiers must be unique.")); return false; } @@ -1372,7 +1404,7 @@ bool IRBuilder::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, O // If it's a namespace, prepend the qualifier and we'll resolve it later to the correct type. QString currentName = qualifiedIdElement->name.toString(); if (qualifiedIdElement->next) { - foreach (QV4::CompiledData::Import* import, _imports) + foreach (const QV4::CompiledData::Import* import, _imports) if (import->qualifierIndex != emptyStringIndex && stringAt(import->qualifierIndex) == currentName) { qualifiedIdElement = qualifiedIdElement->next; @@ -1451,32 +1483,6 @@ void IRBuilder::recordError(const QQmlJS::AST::SourceLocation &location, const Q errors << error; } -void IRBuilder::collectTypeReferences() -{ - foreach (Object *obj, _objects) { - if (obj->inheritedTypeNameIndex != emptyStringIndex) { - QV4::CompiledData::TypeReference &r = _typeReferences.add(obj->inheritedTypeNameIndex, obj->location); - r.needsCreation = true; - r.errorWhenNotFound = true; - } - - for (const Property *prop = obj->firstProperty(); prop; prop = prop->next) { - if (prop->type >= QV4::CompiledData::Property::Custom) { - // ### FIXME: We could report the more accurate location here by using prop->location, but the old - // compiler can't and the tests expect it to be the object location right now. - QV4::CompiledData::TypeReference &r = _typeReferences.add(prop->customTypeNameIndex, obj->location); - r.needsCreation = true; - r.errorWhenNotFound = true; - } - } - - for (const Binding *binding = obj->firstBinding(); binding; binding = binding->next) { - if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) - _typeReferences.add(binding->propertyNameIndex, binding->location); - } - } -} - bool IRBuilder::isStatementNodeScript(QQmlJS::AST::Statement *statement) { if (QQmlJS::AST::ExpressionStatement *stmt = QQmlJS::AST::cast<QQmlJS::AST::ExpressionStatement *>(statement)) { @@ -1502,11 +1508,11 @@ bool IRBuilder::isStatementNodeScript(QQmlJS::AST::Statement *statement) return true; } -QV4::CompiledData::QmlUnit *QmlUnitGenerator::generate(Document &output, int *totalUnitSizeInBytes) +QV4::CompiledData::QmlUnit *QmlUnitGenerator::generate(Document &output) { - jsUnitGenerator = &output.jsGenerator; - int unitSize = 0; - QV4::CompiledData::Unit *jsUnit = jsUnitGenerator->generateUnit(&unitSize); + QV4::CompiledData::CompilationUnit *compilationUnit = output.javaScriptCompilationUnit; + QV4::CompiledData::Unit *jsUnit = compilationUnit->createUnitData(&output); + const uint unitSize = jsUnit->unitSize; const int importSize = sizeof(QV4::CompiledData::Import) * output.imports.count(); const int objectOffsetTableSize = output.objects.count() * sizeof(quint32); @@ -1526,14 +1532,14 @@ QV4::CompiledData::QmlUnit *QmlUnitGenerator::generate(Document &output, int *to } const int totalSize = unitSize + importSize + objectOffsetTableSize + objectsSize; - if (totalUnitSizeInBytes) - *totalUnitSizeInBytes = totalSize; char *data = (char*)malloc(totalSize); memcpy(data, jsUnit, unitSize); - free(jsUnit); + if (jsUnit != compilationUnit->data) + free(jsUnit); jsUnit = 0; QV4::CompiledData::QmlUnit *qmlUnit = reinterpret_cast<QV4::CompiledData::QmlUnit *>(data); + qmlUnit->qmlUnitSize = totalSize; qmlUnit->header.flags |= output.unitFlags; qmlUnit->header.flags |= QV4::CompiledData::Unit::IsQml; qmlUnit->offsetToImports = unitSize; @@ -1544,7 +1550,7 @@ QV4::CompiledData::QmlUnit *QmlUnitGenerator::generate(Document &output, int *to // write imports char *importPtr = data + qmlUnit->offsetToImports; - foreach (QV4::CompiledData::Import *imp, output.imports) { + foreach (const QV4::CompiledData::Import *imp, output.imports) { QV4::CompiledData::Import *importToWrite = reinterpret_cast<QV4::CompiledData::Import*>(importPtr); *importToWrite = *imp; importPtr += sizeof(QV4::CompiledData::Import); @@ -1649,13 +1655,8 @@ char *QmlUnitGenerator::writeBindings(char *bindingPtr, Object *o, BindingFilter return bindingPtr; } -int QmlUnitGenerator::getStringId(const QString &str) const -{ - return jsUnitGenerator->getStringId(str); -} - JSCodeGen::JSCodeGen(const QString &fileName, const QString &sourceCode, QV4::IR::Module *jsModule, QQmlJS::Engine *jsEngine, - QQmlJS::AST::UiProgram *qmlRoot, QQmlTypeNameCache *imports, const QStringList &stringPool) + QQmlJS::AST::UiProgram *qmlRoot, QQmlTypeNameCache *imports, const QV4::Compiler::StringTableGenerator *stringPool) : QQmlJS::Codegen(/*strict mode*/false) , sourceCode(sourceCode) , jsEngine(jsEngine) @@ -1723,7 +1724,7 @@ QVector<int> JSCodeGen::generateJSCodeForFunctionsAndBindings(const QList<Compil if (function) name = function->name.toString(); else if (qmlFunction.nameIndex != 0) - name = stringPool.value(qmlFunction.nameIndex); + name = stringPool->stringForIndex(qmlFunction.nameIndex); else name = QStringLiteral("%qml-expression-entry"); |