diff options
Diffstat (limited to 'src/qml/compiler')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 22 | ||||
-rw-r--r-- | src/qml/compiler/qqmlirbuilder_p.h | 40 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler.cpp | 10 | ||||
-rw-r--r-- | src/qml/compiler/qv4codegen_p.h | 228 | ||||
-rw-r--r-- | src/qml/compiler/qv4compiler.cpp | 4 | ||||
-rw-r--r-- | src/qml/compiler/qv4isel_moth.cpp | 6 | ||||
-rw-r--r-- | src/qml/compiler/qv4isel_moth_p.h | 123 | ||||
-rw-r--r-- | src/qml/compiler/qv4ssa.cpp | 120 | ||||
-rw-r--r-- | src/qml/compiler/qv4ssa_p.h | 15 |
9 files changed, 295 insertions, 273 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index c0f953ca2c..54d0cb4f46 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -362,10 +362,11 @@ bool IRBuilder::generateFromQml(const QString &code, const QString &url, Documen QQmlJS::Parser parser(&output->jsParserEngine); - if (! parser.parse() || !parser.diagnosticMessages().isEmpty()) { - + const bool parseResult = parser.parse(); + const auto diagnosticMessages = parser.diagnosticMessages(); + if (!parseResult || !diagnosticMessages.isEmpty()) { // Extract errors from the parser - foreach (const QQmlJS::DiagnosticMessage &m, parser.diagnosticMessages()) { + for (const QQmlJS::DiagnosticMessage &m : diagnosticMessages) { if (m.isWarning()) { qWarning("%s:%d : %s", qPrintable(url), m.loc.startLine, qPrintable(m.message)); @@ -1018,7 +1019,8 @@ void IRBuilder::setBindingValue(QV4::CompiledData::Binding *binding, QQmlJS::AST CompiledFunctionOrExpression *expr = New<CompiledFunctionOrExpression>(); expr->node = statement; - expr->nameIndex = registerString(QStringLiteral("expression for ") + stringAt(binding->propertyNameIndex)); + expr->nameIndex = registerString(QLatin1String("expression for ") + + stringAt(binding->propertyNameIndex)); expr->disableAcceleratedLookups = false; const int index = bindingsTarget()->functionsAndExpressions->append(expr); binding->value.compiledScriptIndex = index; @@ -1246,7 +1248,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 (const QV4::CompiledData::Import* import, _imports) + for (const QV4::CompiledData::Import* import : qAsConst(_imports)) if (import->qualifierIndex != emptyStringIndex && stringAt(import->qualifierIndex) == currentName) { qualifiedIdElement = qualifiedIdElement->next; @@ -1371,7 +1373,7 @@ QV4::CompiledData::Unit *QmlUnitGenerator::generate(Document &output, QQmlEngine QHash<const Object*, quint32> objectOffsets; int objectsSize = 0; - foreach (Object *o, output.objects) { + for (Object *o : qAsConst(output.objects)) { objectOffsets.insert(o, unitSize + importSize + objectOffsetTableSize + objectsSize); objectsSize += QV4::CompiledData::Object::calculateSizeExcludingSignals(o->functionCount(), o->propertyCount(), o->aliasCount(), o->signalCount(), o->bindingCount(), o->namedObjectsInComponent.count); @@ -1417,7 +1419,7 @@ QV4::CompiledData::Unit *QmlUnitGenerator::generate(Document &output, QQmlEngine // write imports char *importPtr = data + qmlUnit->offsetToImports; - foreach (const QV4::CompiledData::Import *imp, output.imports) { + for (const QV4::CompiledData::Import *imp : qAsConst(output.imports)) { QV4::CompiledData::Import *importToWrite = reinterpret_cast<QV4::CompiledData::Import*>(importPtr); *importToWrite = *imp; importPtr += sizeof(QV4::CompiledData::Import); @@ -1522,7 +1524,7 @@ QV4::CompiledData::Unit *QmlUnitGenerator::generate(Document &output, QQmlEngine } // enable flag if we encountered pragma Singleton - foreach (Pragma *p, output.pragmas) { + for (Pragma *p : qAsConst(output.pragmas)) { if (p->type == Pragma::PragmaSingleton) { qmlUnit->flags |= QV4::CompiledData::Unit::IsSingleton; break; @@ -1588,7 +1590,7 @@ QVector<int> JSCodeGen::generateJSCodeForFunctionsAndBindings(const QList<Compil ScanFunctions scan(this, sourceCode, GlobalCode); scan.enterEnvironment(0, QmlBinding); scan.enterQmlScope(qmlRoot, QStringLiteral("context scope")); - foreach (const CompiledFunctionOrExpression &f, functions) { + for (const CompiledFunctionOrExpression &f : functions) { Q_ASSERT(f.node != qmlRoot); QQmlJS::AST::FunctionDeclaration *function = QQmlJS::AST::cast<QQmlJS::AST::FunctionDeclaration*>(f.node); @@ -1923,7 +1925,7 @@ QV4::IR::Expr *JSCodeGen::fallbackNameLookup(const QString &name, int line, int // with the correct QML context. // Look for IDs first. - foreach (const IdMapping &mapping, _idObjects) + for (const IdMapping &mapping : qAsConst(_idObjects)) if (name == mapping.name) { if (_function->isQmlBinding) _function->idObjectDependencies.insert(mapping.idIndex); diff --git a/src/qml/compiler/qqmlirbuilder_p.h b/src/qml/compiler/qqmlirbuilder_p.h index cc16dc2104..95756845c3 100644 --- a/src/qml/compiler/qqmlirbuilder_p.h +++ b/src/qml/compiler/qqmlirbuilder_p.h @@ -453,9 +453,9 @@ struct Q_QML_PRIVATE_EXPORT ScriptDirectivesCollector : public QQmlJS::Directive QList<const QV4::CompiledData::Import *> imports; bool hasPragmaLibrary; - virtual void pragmaLibrary(); - virtual void importFile(const QString &jsfile, const QString &module, int lineNumber, int column); - virtual void importModule(const QString &uri, const QString &version, const QString &module, int lineNumber, int column); + void pragmaLibrary() override; + void importFile(const QString &jsfile, const QString &module, int lineNumber, int column) override; + void importModule(const QString &uri, const QString &version, const QString &module, int lineNumber, int column) override; }; struct Q_QML_PRIVATE_EXPORT IRBuilder : public QQmlJS::AST::Visitor @@ -470,21 +470,21 @@ public: using QQmlJS::AST::Visitor::visit; using QQmlJS::AST::Visitor::endVisit; - virtual bool visit(QQmlJS::AST::UiArrayMemberList *ast); - virtual bool visit(QQmlJS::AST::UiImport *ast); - virtual bool visit(QQmlJS::AST::UiPragma *ast); - virtual bool visit(QQmlJS::AST::UiHeaderItemList *ast); - virtual bool visit(QQmlJS::AST::UiObjectInitializer *ast); - virtual bool visit(QQmlJS::AST::UiObjectMemberList *ast); - virtual bool visit(QQmlJS::AST::UiParameterList *ast); - virtual bool visit(QQmlJS::AST::UiProgram *); - virtual bool visit(QQmlJS::AST::UiQualifiedId *ast); - virtual bool visit(QQmlJS::AST::UiArrayBinding *ast); - virtual bool visit(QQmlJS::AST::UiObjectBinding *ast); - virtual bool visit(QQmlJS::AST::UiObjectDefinition *ast); - virtual bool visit(QQmlJS::AST::UiPublicMember *ast); - virtual bool visit(QQmlJS::AST::UiScriptBinding *ast); - virtual bool visit(QQmlJS::AST::UiSourceElement *ast); + bool visit(QQmlJS::AST::UiArrayMemberList *ast) override; + bool visit(QQmlJS::AST::UiImport *ast) override; + bool visit(QQmlJS::AST::UiPragma *ast) override; + bool visit(QQmlJS::AST::UiHeaderItemList *ast) override; + bool visit(QQmlJS::AST::UiObjectInitializer *ast) override; + bool visit(QQmlJS::AST::UiObjectMemberList *ast) override; + bool visit(QQmlJS::AST::UiParameterList *ast) override; + bool visit(QQmlJS::AST::UiProgram *) override; + bool visit(QQmlJS::AST::UiQualifiedId *ast) override; + bool visit(QQmlJS::AST::UiArrayBinding *ast) override; + bool visit(QQmlJS::AST::UiObjectBinding *ast) override; + bool visit(QQmlJS::AST::UiObjectDefinition *ast) override; + bool visit(QQmlJS::AST::UiPublicMember *ast) override; + bool visit(QQmlJS::AST::UiScriptBinding *ast) override; + bool visit(QQmlJS::AST::UiSourceElement *ast) override; void accept(QQmlJS::AST::Node *node); @@ -602,8 +602,8 @@ struct Q_QML_PRIVATE_EXPORT JSCodeGen : public QQmlJS::Codegen QVector<int> generateJSCodeForFunctionsAndBindings(const QList<CompiledFunctionOrExpression> &functions); protected: - virtual void beginFunctionBodyHook(); - virtual QV4::IR::Expr *fallbackNameLookup(const QString &name, int line, int col); + void beginFunctionBodyHook() override; + QV4::IR::Expr *fallbackNameLookup(const QString &name, int line, int col) override; private: QQmlPropertyData *lookupQmlCompliantProperty(QQmlPropertyCache *cache, const QString &name, bool *propertyExistsButForceNameLookup = 0); diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index 393616dfac..ab2b0553a9 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -471,7 +471,7 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio QQmlJS::MemoryPool *pool = compiler->memoryPool(); QQmlJS::AST::FormalParameterList *paramList = 0; - foreach (const QString ¶m, parameters) { + for (const QString ¶m : qAsConst(parameters)) { QStringRef paramNameRef = compiler->newStringRef(param); if (paramList) @@ -1348,9 +1348,9 @@ bool QQmlJSCodeGenerator::compileJavaScriptCodeInObjectsRecursively(int objectIn functionsToCompile << *foe; } const QVector<int> runtimeFunctionIndices = v4CodeGen->generateJSCodeForFunctionsAndBindings(functionsToCompile); - QList<QQmlError> jsErrors = v4CodeGen->qmlErrors(); + const QList<QQmlError> jsErrors = v4CodeGen->qmlErrors(); if (!jsErrors.isEmpty()) { - foreach (const QQmlError &e, jsErrors) + for (const QQmlError &e : jsErrors) compiler->recordError(e); return false; } @@ -1729,7 +1729,7 @@ void QQmlIRFunctionCleanser::clean() module->functions = newFunctions; - foreach (QV4::IR::Function *function, module->functions) { + for (QV4::IR::Function *function : qAsConst(module->functions)) { for (QV4::IR::BasicBlock *block : function->basicBlocks()) { for (QV4::IR::Stmt *s : block->statements()) { visit(s); @@ -1737,7 +1737,7 @@ void QQmlIRFunctionCleanser::clean() } } - foreach (QmlIR::Object *obj, *compiler->qmlObjects()) { + for (QmlIR::Object *obj : qAsConst(*compiler->qmlObjects())) { for (int i = 0; i < obj->runtimeFunctionIndices.count; ++i) obj->runtimeFunctionIndices[i] = newFunctionIndices[obj->runtimeFunctionIndices.at(i)]; } diff --git a/src/qml/compiler/qv4codegen_p.h b/src/qml/compiler/qv4codegen_p.h index 59199183bd..742ee79648 100644 --- a/src/qml/compiler/qv4codegen_p.h +++ b/src/qml/compiler/qv4codegen_p.h @@ -331,103 +331,103 @@ protected: virtual void beginFunctionBodyHook() {} // nodes - virtual bool visit(AST::ArgumentList *ast); - virtual bool visit(AST::CaseBlock *ast); - virtual bool visit(AST::CaseClause *ast); - virtual bool visit(AST::CaseClauses *ast); - virtual bool visit(AST::Catch *ast); - virtual bool visit(AST::DefaultClause *ast); - virtual bool visit(AST::ElementList *ast); - virtual bool visit(AST::Elision *ast); - virtual bool visit(AST::Finally *ast); - virtual bool visit(AST::FormalParameterList *ast); - virtual bool visit(AST::FunctionBody *ast); - virtual bool visit(AST::Program *ast); - virtual bool visit(AST::PropertyNameAndValue *ast); - virtual bool visit(AST::PropertyAssignmentList *ast); - virtual bool visit(AST::PropertyGetterSetter *ast); - virtual bool visit(AST::SourceElements *ast); - virtual bool visit(AST::StatementList *ast); - virtual bool visit(AST::UiArrayMemberList *ast); - virtual bool visit(AST::UiImport *ast); - virtual bool visit(AST::UiHeaderItemList *ast); - virtual bool visit(AST::UiPragma *ast); - virtual bool visit(AST::UiObjectInitializer *ast); - virtual bool visit(AST::UiObjectMemberList *ast); - virtual bool visit(AST::UiParameterList *ast); - virtual bool visit(AST::UiProgram *ast); - virtual bool visit(AST::UiQualifiedId *ast); - virtual bool visit(AST::UiQualifiedPragmaId *ast); - virtual bool visit(AST::VariableDeclaration *ast); - virtual bool visit(AST::VariableDeclarationList *ast); + bool visit(AST::ArgumentList *ast) override; + bool visit(AST::CaseBlock *ast) override; + bool visit(AST::CaseClause *ast) override; + bool visit(AST::CaseClauses *ast) override; + bool visit(AST::Catch *ast) override; + bool visit(AST::DefaultClause *ast) override; + bool visit(AST::ElementList *ast) override; + bool visit(AST::Elision *ast) override; + bool visit(AST::Finally *ast) override; + bool visit(AST::FormalParameterList *ast) override; + bool visit(AST::FunctionBody *ast) override; + bool visit(AST::Program *ast) override; + bool visit(AST::PropertyNameAndValue *ast) override; + bool visit(AST::PropertyAssignmentList *ast) override; + bool visit(AST::PropertyGetterSetter *ast) override; + bool visit(AST::SourceElements *ast) override; + bool visit(AST::StatementList *ast) override; + bool visit(AST::UiArrayMemberList *ast) override; + bool visit(AST::UiImport *ast) override; + bool visit(AST::UiHeaderItemList *ast) override; + bool visit(AST::UiPragma *ast) override; + bool visit(AST::UiObjectInitializer *ast) override; + bool visit(AST::UiObjectMemberList *ast) override; + bool visit(AST::UiParameterList *ast) override; + bool visit(AST::UiProgram *ast) override; + bool visit(AST::UiQualifiedId *ast) override; + bool visit(AST::UiQualifiedPragmaId *ast) override; + bool visit(AST::VariableDeclaration *ast) override; + bool visit(AST::VariableDeclarationList *ast) override; // expressions - virtual bool visit(AST::Expression *ast); - virtual bool visit(AST::ArrayLiteral *ast); - virtual bool visit(AST::ArrayMemberExpression *ast); - virtual bool visit(AST::BinaryExpression *ast); - virtual bool visit(AST::CallExpression *ast); - virtual bool visit(AST::ConditionalExpression *ast); - virtual bool visit(AST::DeleteExpression *ast); - virtual bool visit(AST::FalseLiteral *ast); - virtual bool visit(AST::FieldMemberExpression *ast); - virtual bool visit(AST::FunctionExpression *ast); - virtual bool visit(AST::IdentifierExpression *ast); - virtual bool visit(AST::NestedExpression *ast); - virtual bool visit(AST::NewExpression *ast); - virtual bool visit(AST::NewMemberExpression *ast); - virtual bool visit(AST::NotExpression *ast); - virtual bool visit(AST::NullExpression *ast); - virtual bool visit(AST::NumericLiteral *ast); - virtual bool visit(AST::ObjectLiteral *ast); - virtual bool visit(AST::PostDecrementExpression *ast); - virtual bool visit(AST::PostIncrementExpression *ast); - virtual bool visit(AST::PreDecrementExpression *ast); - virtual bool visit(AST::PreIncrementExpression *ast); - virtual bool visit(AST::RegExpLiteral *ast); - virtual bool visit(AST::StringLiteral *ast); - virtual bool visit(AST::ThisExpression *ast); - virtual bool visit(AST::TildeExpression *ast); - virtual bool visit(AST::TrueLiteral *ast); - virtual bool visit(AST::TypeOfExpression *ast); - virtual bool visit(AST::UnaryMinusExpression *ast); - virtual bool visit(AST::UnaryPlusExpression *ast); - virtual bool visit(AST::VoidExpression *ast); - virtual bool visit(AST::FunctionDeclaration *ast); + bool visit(AST::Expression *ast) override; + bool visit(AST::ArrayLiteral *ast) override; + bool visit(AST::ArrayMemberExpression *ast) override; + bool visit(AST::BinaryExpression *ast) override; + bool visit(AST::CallExpression *ast) override; + bool visit(AST::ConditionalExpression *ast) override; + bool visit(AST::DeleteExpression *ast) override; + bool visit(AST::FalseLiteral *ast) override; + bool visit(AST::FieldMemberExpression *ast) override; + bool visit(AST::FunctionExpression *ast) override; + bool visit(AST::IdentifierExpression *ast) override; + bool visit(AST::NestedExpression *ast) override; + bool visit(AST::NewExpression *ast) override; + bool visit(AST::NewMemberExpression *ast) override; + bool visit(AST::NotExpression *ast) override; + bool visit(AST::NullExpression *ast) override; + bool visit(AST::NumericLiteral *ast) override; + bool visit(AST::ObjectLiteral *ast) override; + bool visit(AST::PostDecrementExpression *ast) override; + bool visit(AST::PostIncrementExpression *ast) override; + bool visit(AST::PreDecrementExpression *ast) override; + bool visit(AST::PreIncrementExpression *ast) override; + bool visit(AST::RegExpLiteral *ast) override; + bool visit(AST::StringLiteral *ast) override; + bool visit(AST::ThisExpression *ast) override; + bool visit(AST::TildeExpression *ast) override; + bool visit(AST::TrueLiteral *ast) override; + bool visit(AST::TypeOfExpression *ast) override; + bool visit(AST::UnaryMinusExpression *ast) override; + bool visit(AST::UnaryPlusExpression *ast) override; + bool visit(AST::VoidExpression *ast) override; + bool visit(AST::FunctionDeclaration *ast) override; // source elements - virtual bool visit(AST::FunctionSourceElement *ast); - virtual bool visit(AST::StatementSourceElement *ast); + bool visit(AST::FunctionSourceElement *ast) override; + bool visit(AST::StatementSourceElement *ast) override; // statements - virtual bool visit(AST::Block *ast); - virtual bool visit(AST::BreakStatement *ast); - virtual bool visit(AST::ContinueStatement *ast); - virtual bool visit(AST::DebuggerStatement *ast); - virtual bool visit(AST::DoWhileStatement *ast); - virtual bool visit(AST::EmptyStatement *ast); - virtual bool visit(AST::ExpressionStatement *ast); - virtual bool visit(AST::ForEachStatement *ast); - virtual bool visit(AST::ForStatement *ast); - virtual bool visit(AST::IfStatement *ast); - virtual bool visit(AST::LabelledStatement *ast); - virtual bool visit(AST::LocalForEachStatement *ast); - virtual bool visit(AST::LocalForStatement *ast); - virtual bool visit(AST::ReturnStatement *ast); - virtual bool visit(AST::SwitchStatement *ast); - virtual bool visit(AST::ThrowStatement *ast); - virtual bool visit(AST::TryStatement *ast); - virtual bool visit(AST::VariableStatement *ast); - virtual bool visit(AST::WhileStatement *ast); - virtual bool visit(AST::WithStatement *ast); + bool visit(AST::Block *ast) override; + bool visit(AST::BreakStatement *ast) override; + bool visit(AST::ContinueStatement *ast) override; + bool visit(AST::DebuggerStatement *ast) override; + bool visit(AST::DoWhileStatement *ast) override; + bool visit(AST::EmptyStatement *ast) override; + bool visit(AST::ExpressionStatement *ast) override; + bool visit(AST::ForEachStatement *ast) override; + bool visit(AST::ForStatement *ast) override; + bool visit(AST::IfStatement *ast) override; + bool visit(AST::LabelledStatement *ast) override; + bool visit(AST::LocalForEachStatement *ast) override; + bool visit(AST::LocalForStatement *ast) override; + bool visit(AST::ReturnStatement *ast) override; + bool visit(AST::SwitchStatement *ast) override; + bool visit(AST::ThrowStatement *ast) override; + bool visit(AST::TryStatement *ast) override; + bool visit(AST::VariableStatement *ast) override; + bool visit(AST::WhileStatement *ast) override; + bool visit(AST::WithStatement *ast) override; // ui object members - virtual bool visit(AST::UiArrayBinding *ast); - virtual bool visit(AST::UiObjectBinding *ast); - virtual bool visit(AST::UiObjectDefinition *ast); - virtual bool visit(AST::UiPublicMember *ast); - virtual bool visit(AST::UiScriptBinding *ast); - virtual bool visit(AST::UiSourceElement *ast); + bool visit(AST::UiArrayBinding *ast) override; + bool visit(AST::UiObjectBinding *ast) override; + bool visit(AST::UiObjectDefinition *ast) override; + bool visit(AST::UiPublicMember *ast) override; + bool visit(AST::UiScriptBinding *ast) override; + bool visit(AST::UiSourceElement *ast) override; bool throwSyntaxErrorOnEvalOrArgumentsInStrictMode(QV4::IR::Expr* expr, const AST::SourceLocation &loc); virtual void throwSyntaxError(const AST::SourceLocation &loc, const QString &detail); @@ -486,39 +486,39 @@ protected: void checkName(const QStringRef &name, const AST::SourceLocation &loc); void checkForArguments(AST::FormalParameterList *parameters); - virtual bool visit(AST::Program *ast); - virtual void endVisit(AST::Program *); + bool visit(AST::Program *ast) override; + void endVisit(AST::Program *) override; - virtual bool visit(AST::CallExpression *ast); - virtual bool visit(AST::NewMemberExpression *ast); - virtual bool visit(AST::ArrayLiteral *ast); - virtual bool visit(AST::VariableDeclaration *ast); - virtual bool visit(AST::IdentifierExpression *ast); - virtual bool visit(AST::ExpressionStatement *ast); - virtual bool visit(AST::FunctionExpression *ast); + bool visit(AST::CallExpression *ast) override; + bool visit(AST::NewMemberExpression *ast) override; + bool visit(AST::ArrayLiteral *ast) override; + bool visit(AST::VariableDeclaration *ast) override; + bool visit(AST::IdentifierExpression *ast) override; + bool visit(AST::ExpressionStatement *ast) override; + bool visit(AST::FunctionExpression *ast) override; void enterFunction(AST::FunctionExpression *ast, bool enterName, bool isExpression = true); - virtual void endVisit(AST::FunctionExpression *); + void endVisit(AST::FunctionExpression *) override; - virtual bool visit(AST::ObjectLiteral *ast); + bool visit(AST::ObjectLiteral *ast) override; - virtual bool visit(AST::PropertyGetterSetter *ast); - virtual void endVisit(AST::PropertyGetterSetter *); + bool visit(AST::PropertyGetterSetter *ast) override; + void endVisit(AST::PropertyGetterSetter *) override; - virtual bool visit(AST::FunctionDeclaration *ast); - virtual void endVisit(AST::FunctionDeclaration *); + bool visit(AST::FunctionDeclaration *ast) override; + void endVisit(AST::FunctionDeclaration *) override; - virtual bool visit(AST::WithStatement *ast); + bool visit(AST::WithStatement *ast) override; - virtual bool visit(AST::DoWhileStatement *ast); - virtual bool visit(AST::ForStatement *ast); - virtual bool visit(AST::LocalForStatement *ast); - virtual bool visit(AST::ForEachStatement *ast); - virtual bool visit(AST::LocalForEachStatement *ast); - virtual bool visit(AST::ThisExpression *ast); + bool visit(AST::DoWhileStatement *ast) override; + bool visit(AST::ForStatement *ast) override; + bool visit(AST::LocalForStatement *ast) override; + bool visit(AST::ForEachStatement *ast) override; + bool visit(AST::LocalForEachStatement *ast) override; + bool visit(AST::ThisExpression *ast) override; - virtual bool visit(AST::Block *ast); + bool visit(AST::Block *ast) override; protected: void enterFunction(AST::Node *ast, const QString &name, AST::FormalParameterList *formals, AST::FunctionBody *body, AST::FunctionExpression *expr, bool isExpression); @@ -544,8 +544,8 @@ public: , engine(engine) {} - virtual void throwSyntaxError(const AST::SourceLocation &loc, const QString &detail); - virtual void throwReferenceError(const AST::SourceLocation &loc, const QString &detail); + void throwSyntaxError(const AST::SourceLocation &loc, const QString &detail) override; + void throwReferenceError(const AST::SourceLocation &loc, const QString &detail) override; private: QV4::ExecutionEngine *engine; }; diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index e1ea3a9b88..cd822a2614 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -212,7 +212,7 @@ int QV4::Compiler::JSUnitGenerator::registerJSClass(int count, IR::ExprList *arg QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorOption option) { registerString(irModule->fileName); - foreach (QV4::IR::Function *f, irModule->functions) { + for (QV4::IR::Function *f : qAsConst(irModule->functions)) { registerString(*f->name); for (int i = 0; i < f->formals.size(); ++i) registerString(*f->formals.at(i)); @@ -244,7 +244,7 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorO } CompiledData::Lookup *lookupsToWrite = reinterpret_cast<CompiledData::Lookup*>(dataPtr + unit->offsetToLookupTable); - foreach (const CompiledData::Lookup &l, lookups) + for (const CompiledData::Lookup &l : qAsConst(lookups)) *lookupsToWrite++ = l; CompiledData::RegExp *regexpTable = reinterpret_cast<CompiledData::RegExp *>(dataPtr + unit->offsetToRegexpTable); diff --git a/src/qml/compiler/qv4isel_moth.cpp b/src/qml/compiler/qv4isel_moth.cpp index f2bd57ad8f..9dbebd1128 100644 --- a/src/qml/compiler/qv4isel_moth.cpp +++ b/src/qml/compiler/qv4isel_moth.cpp @@ -209,7 +209,7 @@ void InstructionSelection::run(int functionIndex) ConvertTemps().toStackSlots(_function); } - QSet<IR::Jump *> removableJumps = opt.calculateOptionalJumps(); + BitVector removableJumps = opt.calculateOptionalJumps(); qSwap(_removableJumps, removableJumps); IR::Stmt *cs = 0; @@ -297,7 +297,7 @@ QQmlRefPointer<QV4::CompiledData::CompilationUnit> InstructionSelection::backend { compilationUnit->codeRefs.resize(irModule->functions.size()); int i = 0; - foreach (IR::Function *irFunction, irModule->functions) + for (IR::Function *irFunction : qAsConst(irModule->functions)) compilationUnit->codeRefs[i++] = codeRefs[irFunction]; QQmlRefPointer<QV4::CompiledData::CompilationUnit> result; result.adopt(compilationUnit.take()); @@ -955,7 +955,7 @@ void InstructionSelection::visitJump(IR::Jump *s) { if (s->target == _nextBlock) return; - if (_removableJumps.contains(s)) + if (_removableJumps.at(_block->index())) return; addDebugInstruction(); diff --git a/src/qml/compiler/qv4isel_moth_p.h b/src/qml/compiler/qv4isel_moth_p.h index 74323a2912..afe5fe342e 100644 --- a/src/qml/compiler/qv4isel_moth_p.h +++ b/src/qml/compiler/qv4isel_moth_p.h @@ -54,6 +54,7 @@ #include <private/qv4global_p.h> #include <private/qv4isel_p.h> #include <private/qv4isel_util_p.h> +#include <private/qv4util_p.h> #include <private/qv4jsir_p.h> #include <private/qv4value_p.h> #include "qv4instr_moth_p.h" @@ -85,68 +86,68 @@ public: InstructionSelection(QQmlEnginePrivate *qmlEngine, QV4::ExecutableAllocator *execAllocator, IR::Module *module, QV4::Compiler::JSUnitGenerator *jsGenerator, EvalISelFactory *iselFactory); ~InstructionSelection(); - virtual void run(int functionIndex); + void run(int functionIndex) override; protected: - virtual QQmlRefPointer<CompiledData::CompilationUnit> backendCompileStep(); - - virtual void visitJump(IR::Jump *); - virtual void visitCJump(IR::CJump *); - virtual void visitRet(IR::Ret *); - - virtual void callBuiltinInvalid(IR::Name *func, IR::ExprList *args, IR::Expr *result); - virtual void callBuiltinTypeofQmlContextProperty(IR::Expr *base, IR::Member::MemberKind kind, int propertyIndex, IR::Expr *result); - virtual void callBuiltinTypeofMember(IR::Expr *base, const QString &name, IR::Expr *result); - virtual void callBuiltinTypeofSubscript(IR::Expr *base, IR::Expr *index, IR::Expr *result); - virtual void callBuiltinTypeofName(const QString &name, IR::Expr *result); - virtual void callBuiltinTypeofValue(IR::Expr *value, IR::Expr *result); - virtual void callBuiltinDeleteMember(IR::Expr *base, const QString &name, IR::Expr *result); - virtual void callBuiltinDeleteSubscript(IR::Expr *base, IR::Expr *index, IR::Expr *result); - virtual void callBuiltinDeleteName(const QString &name, IR::Expr *result); - virtual void callBuiltinDeleteValue(IR::Expr *result); - virtual void callBuiltinThrow(IR::Expr *arg); - virtual void callBuiltinReThrow(); - virtual void callBuiltinUnwindException(IR::Expr *); - virtual void callBuiltinPushCatchScope(const QString &exceptionName); - virtual void callBuiltinForeachIteratorObject(IR::Expr *arg, IR::Expr *result); - virtual void callBuiltinForeachNextPropertyname(IR::Expr *arg, IR::Expr *result); - virtual void callBuiltinPushWithScope(IR::Expr *arg); - virtual void callBuiltinPopScope(); - virtual void callBuiltinDeclareVar(bool deletable, const QString &name); - virtual void callBuiltinDefineArray(IR::Expr *result, IR::ExprList *args); - virtual void callBuiltinDefineObjectLiteral(IR::Expr *result, int keyValuePairCount, IR::ExprList *keyValuePairs, IR::ExprList *arrayEntries, bool needSparseArray); - virtual void callBuiltinSetupArgumentObject(IR::Expr *result); - virtual void callBuiltinConvertThisToObject(); - virtual void callValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result); - virtual void callQmlContextProperty(IR::Expr *base, IR::Member::MemberKind kind, int propertyIndex, IR::ExprList *args, IR::Expr *result); - virtual void callProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result); - virtual void callSubscript(IR::Expr *base, IR::Expr *index, IR::ExprList *args, IR::Expr *result); - virtual void convertType(IR::Expr *source, IR::Expr *target); - virtual void constructActivationProperty(IR::Name *func, IR::ExprList *args, IR::Expr *result); - virtual void constructProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result); - virtual void constructValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result); - virtual void loadThisObject(IR::Expr *e); - virtual void loadQmlContext(IR::Expr *e); - virtual void loadQmlImportedScripts(IR::Expr *e); - virtual void loadQmlSingleton(const QString &name, IR::Expr *e); - virtual void loadConst(IR::Const *sourceConst, IR::Expr *e); - virtual void loadString(const QString &str, IR::Expr *target); - virtual void loadRegexp(IR::RegExp *sourceRegexp, IR::Expr *target); - virtual void getActivationProperty(const IR::Name *name, IR::Expr *target); - virtual void setActivationProperty(IR::Expr *source, const QString &targetName); - virtual void initClosure(IR::Closure *closure, IR::Expr *target); - virtual void getProperty(IR::Expr *base, const QString &name, IR::Expr *target); - virtual void setProperty(IR::Expr *source, IR::Expr *targetBase, const QString &targetName); - virtual void setQmlContextProperty(IR::Expr *source, IR::Expr *targetBase, IR::Member::MemberKind kind, int propertyIndex); - virtual void setQObjectProperty(IR::Expr *source, IR::Expr *targetBase, int propertyIndex); - virtual void getQmlContextProperty(IR::Expr *source, IR::Member::MemberKind kind, int index, bool captureRequired, IR::Expr *target); - virtual void getQObjectProperty(IR::Expr *base, int propertyIndex, bool captureRequired, bool isSingleton, int attachedPropertiesId, IR::Expr *target); - virtual void getElement(IR::Expr *base, IR::Expr *index, IR::Expr *target); - virtual void setElement(IR::Expr *source, IR::Expr *targetBase, IR::Expr *targetIndex); - virtual void copyValue(IR::Expr *source, IR::Expr *target); - virtual void swapValues(IR::Expr *source, IR::Expr *target); - virtual void unop(IR::AluOp oper, IR::Expr *source, IR::Expr *target); - virtual void binop(IR::AluOp oper, IR::Expr *leftSource, IR::Expr *rightSource, IR::Expr *target); + QQmlRefPointer<CompiledData::CompilationUnit> backendCompileStep() override; + + void visitJump(IR::Jump *) override; + void visitCJump(IR::CJump *) override; + void visitRet(IR::Ret *) override; + + void callBuiltinInvalid(IR::Name *func, IR::ExprList *args, IR::Expr *result) override; + void callBuiltinTypeofQmlContextProperty(IR::Expr *base, IR::Member::MemberKind kind, int propertyIndex, IR::Expr *result) override; + void callBuiltinTypeofMember(IR::Expr *base, const QString &name, IR::Expr *result) override; + void callBuiltinTypeofSubscript(IR::Expr *base, IR::Expr *index, IR::Expr *result) override; + void callBuiltinTypeofName(const QString &name, IR::Expr *result) override; + void callBuiltinTypeofValue(IR::Expr *value, IR::Expr *result) override; + void callBuiltinDeleteMember(IR::Expr *base, const QString &name, IR::Expr *result) override; + void callBuiltinDeleteSubscript(IR::Expr *base, IR::Expr *index, IR::Expr *result) override; + void callBuiltinDeleteName(const QString &name, IR::Expr *result) override; + void callBuiltinDeleteValue(IR::Expr *result) override; + void callBuiltinThrow(IR::Expr *arg) override; + void callBuiltinReThrow() override; + void callBuiltinUnwindException(IR::Expr *) override; + void callBuiltinPushCatchScope(const QString &exceptionName) override; + void callBuiltinForeachIteratorObject(IR::Expr *arg, IR::Expr *result) override; + void callBuiltinForeachNextPropertyname(IR::Expr *arg, IR::Expr *result) override; + void callBuiltinPushWithScope(IR::Expr *arg) override; + void callBuiltinPopScope() override; + void callBuiltinDeclareVar(bool deletable, const QString &name) override; + void callBuiltinDefineArray(IR::Expr *result, IR::ExprList *args) override; + void callBuiltinDefineObjectLiteral(IR::Expr *result, int keyValuePairCount, IR::ExprList *keyValuePairs, IR::ExprList *arrayEntries, bool needSparseArray) override; + void callBuiltinSetupArgumentObject(IR::Expr *result) override; + void callBuiltinConvertThisToObject() override; + void callValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result) override; + void callQmlContextProperty(IR::Expr *base, IR::Member::MemberKind kind, int propertyIndex, IR::ExprList *args, IR::Expr *result) override; + void callProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result) override; + void callSubscript(IR::Expr *base, IR::Expr *index, IR::ExprList *args, IR::Expr *result) override; + void convertType(IR::Expr *source, IR::Expr *target) override; + void constructActivationProperty(IR::Name *func, IR::ExprList *args, IR::Expr *result) override; + void constructProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result) override; + void constructValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result) override; + void loadThisObject(IR::Expr *e) override; + void loadQmlContext(IR::Expr *e) override; + void loadQmlImportedScripts(IR::Expr *e) override; + void loadQmlSingleton(const QString &name, IR::Expr *e) override; + void loadConst(IR::Const *sourceConst, IR::Expr *e) override; + void loadString(const QString &str, IR::Expr *target) override; + void loadRegexp(IR::RegExp *sourceRegexp, IR::Expr *target) override; + void getActivationProperty(const IR::Name *name, IR::Expr *target) override; + void setActivationProperty(IR::Expr *source, const QString &targetName) override; + void initClosure(IR::Closure *closure, IR::Expr *target) override; + void getProperty(IR::Expr *base, const QString &name, IR::Expr *target) override; + void setProperty(IR::Expr *source, IR::Expr *targetBase, const QString &targetName) override; + void setQmlContextProperty(IR::Expr *source, IR::Expr *targetBase, IR::Member::MemberKind kind, int propertyIndex) override; + void setQObjectProperty(IR::Expr *source, IR::Expr *targetBase, int propertyIndex) override; + void getQmlContextProperty(IR::Expr *source, IR::Member::MemberKind kind, int index, bool captureRequired, IR::Expr *target) override; + void getQObjectProperty(IR::Expr *base, int propertyIndex, bool captureRequired, bool isSingleton, int attachedPropertiesId, IR::Expr *target) override; + void getElement(IR::Expr *base, IR::Expr *index, IR::Expr *target) override; + void setElement(IR::Expr *source, IR::Expr *targetBase, IR::Expr *targetIndex) override; + void copyValue(IR::Expr *source, IR::Expr *target) override; + void swapValues(IR::Expr *source, IR::Expr *target) override; + void unop(IR::AluOp oper, IR::Expr *source, IR::Expr *target) override; + void binop(IR::AluOp oper, IR::Expr *leftSource, IR::Expr *rightSource, IR::Expr *target) override; private: Param binopHelper(IR::AluOp oper, IR::Expr *leftSource, IR::Expr *rightSource, IR::Expr *target); @@ -199,7 +200,7 @@ private: uchar *_codeNext; uchar *_codeEnd; - QSet<IR::Jump *> _removableJumps; + BitVector _removableJumps; IR::Stmt *_currentStatement; QScopedPointer<CompilationUnit> compilationUnit; diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp index deba41ef9d..943700de44 100644 --- a/src/qml/compiler/qv4ssa.cpp +++ b/src/qml/compiler/qv4ssa.cpp @@ -1123,7 +1123,7 @@ public: { QVector<UntypedTemp> res; res.reserve(tempCount()); - foreach (const DefUse &du, _defUses) + for (const DefUse &du : _defUses) if (du.isValid()) res.append(UntypedTemp(du.temp)); return res; @@ -1150,7 +1150,7 @@ public: { Q_ASSERT(static_cast<unsigned>(variable.index) < _defUses.size()); QVector<Stmt *> &uses = _defUses[variable.index].uses; - foreach (Stmt *stmt, newUses) + for (Stmt *stmt : newUses) if (std::find(uses.begin(), uses.end(), stmt) == uses.end()) uses.push_back(stmt); } @@ -1226,7 +1226,7 @@ public: QVector<Stmt*> removeDefUses(Stmt *s) { QVector<Stmt*> defStmts; - foreach (const Temp &usedVar, usedVars(s)) { + for (const Temp &usedVar : usedVars(s)) { if (Stmt *ds = defStmt(usedVar)) defStmts += ds; removeUse(s, usedVar); @@ -1247,7 +1247,7 @@ public: buf.open(QIODevice::WriteOnly); QTextStream qout(&buf); qout << "Defines and uses:" << endl; - foreach (const DefUse &du, _defUses) { + for (const DefUse &du : _defUses) { if (!du.isValid()) continue; qout << '%' << du.temp.index; @@ -1255,14 +1255,14 @@ public: << ", statement: " << du.defStmt->id() << endl; qout << " uses:"; - foreach (Stmt *s, du.uses) + for (Stmt *s : du.uses) qout << ' ' << s->id(); qout << endl; } qout << "Uses per statement:" << endl; for (size_t i = 0, ei = _usesPerStatement.size(); i != ei; ++i) { qout << " " << i << ":"; - foreach (const Temp &t, _usesPerStatement[i]) + for (const Temp &t : _usesPerStatement[i]) qout << ' ' << t.index; qout << endl; } @@ -1633,7 +1633,7 @@ bool hasPhiOnlyUses(Phi *phi, const DefUses &defUses, QBitArray &collectedPhis) { collectedPhis.setBit(phi->id()); - foreach (Stmt *use, defUses.uses(*phi->targetTemp)) { + for (Stmt *use : defUses.uses(*phi->targetTemp)) { Phi *dependentPhi = use->asPhi(); if (!dependentPhi) return false; // there is a use by a non-phi node @@ -1679,7 +1679,7 @@ void cleanupPhis(DefUses &defUses) const Temp &targetVar = *phi->targetTemp; defUses.defStmtBlock(targetVar)->removeStatement(phi); - foreach (const Temp &usedVar, defUses.usedVars(phi)) + for (const Temp &usedVar : defUses.usedVars(phi)) defUses.removeUse(phi, usedVar); defUses.removeDef(targetVar); } @@ -1729,7 +1729,7 @@ public: worklist.assign(worklist.size(), false); worklistSize = 0; - foreach (Stmt *s, stmts) { + for (Stmt *s : stmts) { if (!s) continue; @@ -1802,7 +1802,7 @@ public: StatementWorklist &operator+=(const QVector<Stmt *> &stmts) { - foreach (Stmt *s, stmts) + for (Stmt *s : stmts) this->operator+=(s); return *this; @@ -2091,7 +2091,7 @@ public: theTemp = temp; if (Stmt *defStmt = defUses.defStmt(temp.temp)) visit(defStmt); - foreach (Stmt *use, defUses.uses(temp.temp)) + for (Stmt *use : defUses.uses(temp.temp)) visit(use); } @@ -2245,7 +2245,7 @@ private: it = ty; if (DebugTypeInference) { - foreach (Stmt *s, _defUses.uses(*t)) { + for (Stmt *s : _defUses.uses(*t)) { QBuffer buf; buf.open(QIODevice::WriteOnly); QTextStream qout(&buf); @@ -2605,7 +2605,7 @@ public: } PropagateTempTypes propagator(_defUses); - foreach (const UntypedTemp &t, knownOk) { + for (const UntypedTemp &t : qAsConst(knownOk)) { propagator.run(t, SInt32Type); if (Stmt *defStmt = _defUses.defStmt(t.temp)) { if (Move *m = defStmt->asMove()) { @@ -2629,7 +2629,7 @@ private: if (uses.isEmpty()) return false; - foreach (Stmt *use, uses) { + for (Stmt *use : uses) { if (Move *m = use->asMove()) { Temp *targetTemp = m->target->asTemp(); @@ -3165,7 +3165,8 @@ public: std::vector<BasicBlock *> backedges; backedges.reserve(4); - foreach (BasicBlock *bb, dt.calculateDFNodeIterOrder()) { + const auto order = dt.calculateDFNodeIterOrder(); + for (BasicBlock *bb : order) { Q_ASSERT(!bb->isRemoved()); backedges.clear(); @@ -3188,12 +3189,12 @@ public: if (!DebugLoopDetection) return; - foreach (LoopInfo *info, loopInfos) { + for (const LoopInfo *info : loopInfos) { qDebug() << "Loop header:" << info->loopHeader->index() << "for loop" << quint64(info); - foreach (BasicBlock *bb, info->loopBody) + for (BasicBlock *bb : info->loopBody) qDebug() << " " << bb->index(); - foreach (LoopInfo *nested, info->nestedLoops) + for (LoopInfo *nested : info->nestedLoops) qDebug() << " sub loop:" << quint64(nested); qDebug() << " parent loop:" << quint64(info->parentLoop); } @@ -3277,15 +3278,15 @@ private: findLoop(loopHeader)->loopBody.append(bb); } - foreach (LoopInfo *info, loopInfos) { - if (BasicBlock *containingLoopHeader = info->loopHeader->containingGroup()) - findLoop(containingLoopHeader)->addNestedLoop(info); + for (int i = 0, size = loopInfos.size(); i < size; ++i) { + if (BasicBlock *containingLoopHeader = loopInfos.at(i)->loopHeader->containingGroup()) + findLoop(containingLoopHeader)->addNestedLoop(loopInfos.at(i)); } } LoopInfo *findLoop(BasicBlock *loopHeader) { - foreach (LoopInfo *info, loopInfos) { + for (LoopInfo *info : qAsConst(loopInfos)) { if (info->loopHeader == loopHeader) return info; } @@ -3459,8 +3460,8 @@ public: }; #ifndef QT_NO_DEBUG -void checkCriticalEdges(QVector<BasicBlock *> basicBlocks) { - foreach (BasicBlock *bb, basicBlocks) { +void checkCriticalEdges(const QVector<BasicBlock *> &basicBlocks) { + for (BasicBlock *bb : basicBlocks) { if (bb && bb->out.size() > 1) { for (BasicBlock *bb2 : bb->out) { if (bb2 && bb2->in.size() > 1) { @@ -3594,7 +3595,7 @@ public: newUses->reserve(uses.size()); // qout << " " << uses.size() << " uses:"<<endl; - foreach (Stmt *use, uses) { + for (Stmt *use : uses) { // qout<<" ";use->dump(qout);qout<<"\n"; visit(use); // qout<<" -> ";use->dump(qout);qout<<"\n"; @@ -3752,7 +3753,7 @@ void unlink(BasicBlock *from, BasicBlock *to, IR::Function *func, DefUses &defUs return; to->in.remove(idx); - foreach (Stmt *outStmt, to->statements()) { + for (Stmt *outStmt : to->statements()) { if (!outStmt) continue; if (Phi *phi = outStmt->asPhi()) { @@ -3770,7 +3771,7 @@ void unlink(BasicBlock *from, BasicBlock *to, IR::Function *func, DefUses &defUs static bool isReachable(BasicBlock *bb, const DominatorTree &dt) { - foreach (BasicBlock *in, bb->in) { + for (BasicBlock *in : bb->in) { if (in->isRemoved()) continue; if (dt.dominates(bb, in)) // a back-edge, not interesting @@ -3940,13 +3941,13 @@ void cfg2dot(IR::Function *f, const QVector<LoopDetection::LoopInfo *> &loops = struct Util { QTextStream &qout; Util(QTextStream &qout): qout(qout) {} - void genLoop(LoopDetection::LoopInfo *loop) + void genLoop(const LoopDetection::LoopInfo *loop) { qout << " subgraph \"cluster" << quint64(loop) << "\" {\n"; qout << " L" << loop->loopHeader->index() << ";\n"; - foreach (BasicBlock *bb, loop->loopBody) + for (BasicBlock *bb : loop->loopBody) qout << " L" << bb->index() << ";\n"; - foreach (LoopDetection::LoopInfo *nested, loop->nestedLoops) + for (LoopDetection::LoopInfo *nested : loop->nestedLoops) genLoop(nested); qout << " }\n"; } @@ -3957,7 +3958,7 @@ void cfg2dot(IR::Function *f, const QVector<LoopDetection::LoopInfo *> &loops = else name = QStringLiteral("%1").arg((unsigned long long)f); qout << "digraph \"" << name << "\" { ordering=out;\n"; - foreach (LoopDetection::LoopInfo *l, loops) { + for (LoopDetection::LoopInfo *l : loops) { if (l->parentLoop == 0) Util(qout).genLoop(l); } @@ -4461,7 +4462,8 @@ public: qout << "Life ranges:" << endl; qout << "Intervals:" << endl; - foreach (const LifeTimeInterval *range, _sortedIntervals->intervals()) { + const auto intervals = _sortedIntervals->intervals(); + for (const LifeTimeInterval *range : intervals) { range->dump(qout); qout << endl; } @@ -4721,7 +4723,7 @@ private: clonedStmt = phi; phi->targetTemp = clone(p->targetTemp); - foreach (Expr *in, p->incoming) + for (Expr *in : p->incoming) phi->incoming.append(clone(in)); block->appendStatement(phi); } else { @@ -4751,7 +4753,7 @@ public: void run(const QVector<LoopDetection::LoopInfo *> &loops) { - foreach (LoopDetection::LoopInfo *loopInfo, loops) + for (LoopDetection::LoopInfo *loopInfo : loops) peelLoop(loopInfo); } @@ -4855,7 +4857,7 @@ private: // The original loop is now peeled off, and won't jump back to the loop header. Meaning, it // is not a loop anymore, so unmark it. loop->loopHeader->markAsGroupStart(false); - foreach (BasicBlock *bb, loop->loopBody) + for (BasicBlock *bb : qAsConst(loop->loopBody)) bb->setContainingGroup(loop->loopHeader->containingGroup()); // calculate the idoms in a separate loop, because addBasicBlock in the previous loop will @@ -4873,7 +4875,7 @@ private: } BasicBlockSet siblings(f); - foreach (BasicBlock *bb, loopExits) + for (BasicBlock *bb : qAsConst(loopExits)) dt.collectSiblings(bb, siblings); dt.recalculateIDoms(siblings, loop->loopHeader); @@ -5520,14 +5522,30 @@ LifeTimeIntervals::Ptr Optimizer::lifeTimeIntervals() const return lifeRanges.intervals(); } -QSet<Jump *> Optimizer::calculateOptionalJumps() +static int countPhis(BasicBlock *bb) { - QSet<Jump *> optional; - QSet<BasicBlock *> reachableWithoutJump; + int count = 0; + for (Stmt *s : bb->statements()) { + if (s->isa<Phi>()) + ++count; + else + break; + } + return count; +} + +// Basic blocks can have only 1 terminator. This function returns a bit vector, where a 1 on a +// certain index indicates that the terminator (jump) at the end of the basic block with that index +// can be omitted. +BitVector Optimizer::calculateOptionalJumps() +{ const int maxSize = function->basicBlockCount(); - optional.reserve(maxSize); - reachableWithoutJump.reserve(maxSize); + BitVector optional(maxSize, false); + if (maxSize < 2) + return optional; + + BitVector reachableWithoutJump(maxSize, false); for (int i = maxSize - 1; i >= 0; --i) { BasicBlock *bb = function->basicBlock(i); @@ -5535,17 +5553,17 @@ QSet<Jump *> Optimizer::calculateOptionalJumps() continue; if (Jump *jump = bb->statements().last()->asJump()) { - if (reachableWithoutJump.contains(jump->target)) { - if (bb->statements().size() > 1) + if (reachableWithoutJump.at(jump->target->index())) { + if (bb->statements().size() - countPhis(bb)> 1) reachableWithoutJump.clear(); - optional.insert(jump); - reachableWithoutJump.insert(bb); + optional.setBit(bb->index()); + reachableWithoutJump.setBit(bb->index()); continue; } } reachableWithoutJump.clear(); - reachableWithoutJump.insert(bb); + reachableWithoutJump.setBit(bb->index()); } return optional; @@ -5644,7 +5662,7 @@ QList<IR::Move *> MoveMapping::insertMoves(BasicBlock *bb, IR::Function *functio newMoves.reserve(_moves.size()); int insertionPoint = atEnd ? bb->statements().size() - 1 : 0; - foreach (const Move &m, _moves) { + for (const Move &m : _moves) { IR::Move *move = function->NewStmt<IR::Move>(); move->init(clone(m.to, function), clone(m.from, function)); move->swap = m.needsSwap; @@ -5663,7 +5681,7 @@ void MoveMapping::dump() const QTextStream os(&buf); IRPrinter printer(&os); os << "Move mapping has " << _moves.size() << " moves..." << endl; - foreach (const Move &m, _moves) { + for (const Move &m : _moves) { os << "\t"; printer.print(m.to); if (m.needsSwap) @@ -5680,8 +5698,8 @@ void MoveMapping::dump() const MoveMapping::Action MoveMapping::schedule(const Move &m, QList<Move> &todo, QList<Move> &delayed, QList<Move> &output, QList<Move> &swaps) const { - Moves usages = sourceUsages(m.to, todo) + sourceUsages(m.to, delayed); - foreach (const Move &dependency, usages) { + const Moves usages = sourceUsages(m.to, todo) + sourceUsages(m.to, delayed); + for (const Move &dependency : usages) { if (!output.contains(dependency)) { if (delayed.contains(dependency)) { // We have a cycle! Break it by swapping instead of assigning. @@ -5692,7 +5710,7 @@ MoveMapping::Action MoveMapping::schedule(const Move &m, QList<Move> &todo, QLis QTextStream out(&buf); IRPrinter printer(&out); out<<"we have a cycle! temps:" << endl; - foreach (const Move &m, delayed) { + for (const Move &m : qAsConst(delayed)) { out<<"\t"; printer.print(m.to); out<<" <- "; diff --git a/src/qml/compiler/qv4ssa_p.h b/src/qml/compiler/qv4ssa_p.h index 3a787f0347..db8b6edd1a 100644 --- a/src/qml/compiler/qv4ssa_p.h +++ b/src/qml/compiler/qv4ssa_p.h @@ -53,6 +53,7 @@ #include "qv4jsir_p.h" #include "qv4isel_util_p.h" +#include <private/qv4util_p.h> #include <QtCore/QSharedPointer> QT_BEGIN_NAMESPACE @@ -246,7 +247,7 @@ public: LifeTimeIntervals::Ptr lifeTimeIntervals() const; - QSet<IR::Jump *> calculateOptionalJumps(); + BitVector calculateOptionalJumps(); static void showMeTheCode(Function *function, const char *marker); @@ -340,7 +341,7 @@ public: } protected: - virtual int allocateFreeSlot() + int allocateFreeSlot() override { for (int i = 0, ei = _slotIsInUse.size(); i != ei; ++i) { if (!_slotIsInUse[i]) { @@ -357,7 +358,7 @@ protected: return -1; } - virtual void process(IR::Stmt *s) + void process(IR::Stmt *s) override { // qDebug("L%d statement %d:", _currentBasicBlock->index, s->id); @@ -411,8 +412,8 @@ protected: } } moves.order(); - QList<IR::Move *> newMoves = moves.insertMoves(_currentBasicBlock, _function, true); - foreach (IR::Move *move, newMoves) + const QList<IR::Move *> newMoves = moves.insertMoves(_currentBasicBlock, _function, true); + for (IR::Move *move : newMoves) visit(move); } } @@ -437,13 +438,13 @@ protected: // qDebug() << "\t - force activating temp" << t.index << "on slot" << _stackSlotForTemp[t.index]; } - virtual void visitPhi(IR::Phi *phi) + void visitPhi(IR::Phi *phi) override { Q_UNUSED(phi); #if !defined(QT_NO_DEBUG) Q_ASSERT(_stackSlotForTemp.contains(phi->targetTemp->index)); Q_ASSERT(_slotIsInUse[_stackSlotForTemp[phi->targetTemp->index]]); - foreach (IR::Expr *e, phi->incoming) { + for (IR::Expr *e : phi->incoming) { if (IR::Temp *t = e->asTemp()) Q_ASSERT(_stackSlotForTemp.contains(t->index)); } |