From e203a868470ab2e435111127f00530f4d8cc581d Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 10 May 2018 22:25:46 +0200 Subject: Unify AST for the different 'for' statements Change-Id: I70ca83b0ce933d64dad4984a236e48592e989742 Reviewed-by: Simon Hausmann --- src/qml/compiler/qv4codegen.cpp | 39 ++++----------------------- src/qml/compiler/qv4codegen_p.h | 1 - src/qml/compiler/qv4compilerscanfunctions.cpp | 10 ------- src/qml/compiler/qv4compilerscanfunctions_p.h | 1 - src/qml/parser/qqmljs.g | 3 +-- src/qml/parser/qqmljsast.cpp | 11 -------- src/qml/parser/qqmljsast_p.h | 33 +++-------------------- src/qml/parser/qqmljsastfwd_p.h | 1 - src/qml/parser/qqmljsastvisitor_p.h | 3 --- 9 files changed, 10 insertions(+), 92 deletions(-) (limited to 'src/qml') diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index a3a7f24bdf..fc7ca911e8 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -79,7 +79,6 @@ static inline void setJumpOutLocation(QV4::Moth::BytecodeGenerator *bytecodeGene case Statement::Kind_ForEachStatement: case Statement::Kind_ForStatement: case Statement::Kind_IfStatement: - case Statement::Kind_LocalForStatement: case Statement::Kind_WhileStatement: bytecodeGenerator->setLocation(fallback); break; @@ -2688,7 +2687,10 @@ bool Codegen::visit(ForStatement *ast) RegisterScope scope(this); - statement(ast->initialiser); + if (ast->initialiser) + statement(ast->initialiser); + else if (ast->declarations) + variableDeclarationList(ast->declarations); BytecodeGenerator::Label cond = bytecodeGenerator->label(); BytecodeGenerator::Label body = bytecodeGenerator->newLabel(); @@ -2765,8 +2767,7 @@ bool Codegen::visit(LabelledStatement *ast) AST::cast(ast->statement) || AST::cast(ast->statement) || AST::cast(ast->statement) || - AST::cast(ast->statement) || - AST::cast(ast->statement)) { + AST::cast(ast->statement)) { statement(ast->statement); // labelledStatement will be associated with the ast->statement's loop. } else { BytecodeGenerator::Label breakLabel = bytecodeGenerator->newLabel(); @@ -2778,36 +2779,6 @@ bool Codegen::visit(LabelledStatement *ast) return false; } -bool Codegen::visit(LocalForStatement *ast) -{ - if (hasError) - return true; - - RegisterScope scope(this); - - variableDeclarationList(ast->declarations); - - BytecodeGenerator::Label cond = bytecodeGenerator->label(); - BytecodeGenerator::Label body = bytecodeGenerator->newLabel(); - BytecodeGenerator::Label step = bytecodeGenerator->newLabel(); - BytecodeGenerator::Label end = bytecodeGenerator->newLabel(); - - ControlFlowLoop flow(this, &end, &step); - - condition(ast->condition, &body, &end, true); - - body.link(); - statement(ast->statement); - setJumpOutLocation(bytecodeGenerator, ast->statement, ast->forToken); - - step.link(); - statement(ast->expression); - bytecodeGenerator->jump().link(cond); - end.link(); - - return false; -} - void Codegen::emitReturn(const Reference &expr) { if (controlFlow && controlFlow->returnRequiresUnwind()) { diff --git a/src/qml/compiler/qv4codegen_p.h b/src/qml/compiler/qv4codegen_p.h index 49752270a0..80ef8edfcc 100644 --- a/src/qml/compiler/qv4codegen_p.h +++ b/src/qml/compiler/qv4codegen_p.h @@ -607,7 +607,6 @@ protected: bool visit(AST::ForStatement *ast) override; bool visit(AST::IfStatement *ast) override; bool visit(AST::LabelledStatement *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; diff --git a/src/qml/compiler/qv4compilerscanfunctions.cpp b/src/qml/compiler/qv4compilerscanfunctions.cpp index ccf7e49e25..31663e2162 100644 --- a/src/qml/compiler/qv4compilerscanfunctions.cpp +++ b/src/qml/compiler/qv4compilerscanfunctions.cpp @@ -321,16 +321,6 @@ bool ScanFunctions::visit(DoWhileStatement *ast) { bool ScanFunctions::visit(ForStatement *ast) { Node::accept(ast->initialiser, this); - Node::accept(ast->condition, this); - Node::accept(ast->expression, this); - - TemporaryBoolAssignment allowFuncDecls(_allowFuncDecls, !_context->isStrict); - Node::accept(ast->statement, this); - - return false; -} - -bool ScanFunctions::visit(LocalForStatement *ast) { Node::accept(ast->declarations, this); Node::accept(ast->condition, this); Node::accept(ast->expression, this); diff --git a/src/qml/compiler/qv4compilerscanfunctions_p.h b/src/qml/compiler/qv4compilerscanfunctions_p.h index 640ee86c0b..4d52548637 100644 --- a/src/qml/compiler/qv4compilerscanfunctions_p.h +++ b/src/qml/compiler/qv4compilerscanfunctions_p.h @@ -125,7 +125,6 @@ protected: bool visit(AST::DoWhileStatement *ast) override; bool visit(AST::ForStatement *ast) override; - bool visit(AST::LocalForStatement *ast) override; bool visit(AST::ForEachStatement *ast) override; void endVisit(AST::ForEachStatement *) override; diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g index 4b1dc437f4..ad19fbe0d9 100644 --- a/src/qml/parser/qqmljs.g +++ b/src/qml/parser/qqmljs.g @@ -3113,12 +3113,11 @@ IterationStatement: T_FOR T_LPAREN LexicalDeclaration T_SEMICOLON ExpressionOpt_ /. case $rule_number: { // ### get rid of the static_cast! - AST::LocalForStatement *node = new (pool) AST::LocalForStatement( + AST::ForStatement *node = new (pool) AST::ForStatement( static_cast(sym(3).Node)->declarations, sym(5).Expression, sym(7).Expression, sym(9).Statement); node->forToken = loc(1); node->lparenToken = loc(2); - node->varToken = loc(3); node->firstSemicolonToken = loc(4); node->secondSemicolonToken = loc(6); node->rparenToken = loc(8); diff --git a/src/qml/parser/qqmljsast.cpp b/src/qml/parser/qqmljsast.cpp index bf3e193291..814262d98b 100644 --- a/src/qml/parser/qqmljsast.cpp +++ b/src/qml/parser/qqmljsast.cpp @@ -768,17 +768,6 @@ void ForStatement::accept0(Visitor *visitor) { if (visitor->visit(this)) { accept(initialiser, visitor); - accept(condition, visitor); - accept(expression, visitor); - accept(statement, visitor); - } - - visitor->endVisit(this); -} - -void LocalForStatement::accept0(Visitor *visitor) -{ - if (visitor->visit(this)) { accept(declarations, visitor); accept(condition, visitor); accept(expression, visitor); diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h index 9ed7ba79e5..91d6410132 100644 --- a/src/qml/parser/qqmljsast_p.h +++ b/src/qml/parser/qqmljsast_p.h @@ -174,7 +174,6 @@ public: Kind_ComputedPropertyName, Kind_IfStatement, Kind_LabelledStatement, - Kind_LocalForStatement, Kind_NewExpression, Kind_NewMemberExpression, Kind_NotExpression, @@ -1650,35 +1649,11 @@ public: initialiser (i), condition (c), expression (e), statement (stmt) { kind = K; } - void accept0(Visitor *visitor) override; - - SourceLocation firstSourceLocation() const override - { return forToken; } - - SourceLocation lastSourceLocation() const override - { return statement->lastSourceLocation(); } - -// attributes - ExpressionNode *initialiser; - ExpressionNode *condition; - ExpressionNode *expression; - Statement *statement; - SourceLocation forToken; - SourceLocation lparenToken; - SourceLocation firstSemicolonToken; - SourceLocation secondSemicolonToken; - SourceLocation rparenToken; -}; - -class QML_PARSER_EXPORT LocalForStatement: public Statement -{ -public: - QQMLJS_DECLARE_AST_NODE(LocalForStatement) - - LocalForStatement(VariableDeclarationList *vlist, ExpressionNode *c, ExpressionNode *e, Statement *stmt): + ForStatement(VariableDeclarationList *vlist, ExpressionNode *c, ExpressionNode *e, Statement *stmt): declarations (vlist), condition (c), expression (e), statement (stmt) { kind = K; } + void accept0(Visitor *visitor) override; SourceLocation firstSourceLocation() const override @@ -1688,13 +1663,13 @@ public: { return statement->lastSourceLocation(); } // attributes - VariableDeclarationList *declarations; + ExpressionNode *initialiser = nullptr; + VariableDeclarationList *declarations = nullptr; ExpressionNode *condition; ExpressionNode *expression; Statement *statement; SourceLocation forToken; SourceLocation lparenToken; - SourceLocation varToken; SourceLocation firstSemicolonToken; SourceLocation secondSemicolonToken; SourceLocation rparenToken; diff --git a/src/qml/parser/qqmljsastfwd_p.h b/src/qml/parser/qqmljsastfwd_p.h index 22cf88919d..196d23a9c4 100644 --- a/src/qml/parser/qqmljsastfwd_p.h +++ b/src/qml/parser/qqmljsastfwd_p.h @@ -140,7 +140,6 @@ class IfStatement; class DoWhileStatement; class WhileStatement; class ForStatement; -class LocalForStatement; class ForEachStatement; class ContinueStatement; class BreakStatement; diff --git a/src/qml/parser/qqmljsastvisitor_p.h b/src/qml/parser/qqmljsastvisitor_p.h index 4dfc50d122..5fbdf4adff 100644 --- a/src/qml/parser/qqmljsastvisitor_p.h +++ b/src/qml/parser/qqmljsastvisitor_p.h @@ -266,9 +266,6 @@ public: virtual bool visit(ForStatement *) { return true; } virtual void endVisit(ForStatement *) {} - virtual bool visit(LocalForStatement *) { return true; } - virtual void endVisit(LocalForStatement *) {} - virtual bool visit(ForEachStatement *) { return true; } virtual void endVisit(ForEachStatement *) {} -- cgit v1.2.3