diff --git a/src/inline.c b/src/inline.c index 8471784e2216..d8a13565378a 100644 --- a/src/inline.c +++ b/src/inline.c @@ -1015,7 +1015,6 @@ Expression *CondExp::doInline(InlineDoState *ids) return ce; } - /* ========== Walk the parse trees, and inline expand functions ============= */ /* Walk the trees, looking for functions to inline. @@ -1027,238 +1026,209 @@ struct InlineScanState FuncDeclaration *fd; // function being scanned }; -Statement *Statement::inlineScan(InlineScanState *iss) -{ - return this; -} +void inlineScan(Statement **s, InlineScanState *iss); -Statement *ExpStatement::inlineScan(InlineScanState *iss) +class InlineScanVisitor : public Visitor { -#if LOG - printf("ExpStatement::inlineScan(%s)\n", toChars()); -#endif - if (exp) +public: + InlineScanState *iss; + Statement *result; + + InlineScanVisitor(InlineScanState *iss) { - exp = exp->inlineScan(iss); + this->iss = iss; + this->result = NULL; + } - /* See if we can inline as a statement rather than as - * an Expression. - */ - if (exp && exp->op == TOKcall) + void visit(Statement *s) + { + } + + void visit(ExpStatement *s) + { + #if LOG + printf("ExpStatement::inlineScan(%s)\n", s->toChars()); + #endif + if (s->exp) { - CallExp *ce = (CallExp *)exp; - if (ce->e1->op == TOKvar) - { - VarExp *ve = (VarExp *)ce->e1; - FuncDeclaration *fd = ve->var->isFuncDeclaration(); + s->exp = s->exp->inlineScan(iss); - if (fd && fd != iss->fd && fd->canInline(0, 0, 1)) + /* See if we can inline as a statement rather than as + * an Expression. + */ + if (s->exp && s->exp->op == TOKcall) + { + CallExp *ce = (CallExp *)s->exp; + if (ce->e1->op == TOKvar) { - Statement *s; - fd->expandInline(iss, NULL, NULL, ce->arguments, &s); - return s; + VarExp *ve = (VarExp *)ce->e1; + FuncDeclaration *fd = ve->var->isFuncDeclaration(); + + if (fd && fd != iss->fd && fd->canInline(0, 0, 1)) + { + fd->expandInline(iss, NULL, NULL, ce->arguments, &result); + } } } } } - return this; -} -Statement *CompoundStatement::inlineScan(InlineScanState *iss) -{ - for (size_t i = 0; i < statements->dim; i++) - { Statement *s = (*statements)[i]; - if (s) - (*statements)[i] = s->inlineScan(iss); + void visit(CompoundStatement *s) + { + for (size_t i = 0; i < s->statements->dim; i++) + { + inlineScan(&(*s->statements)[i]); + } } - return this; -} -Statement *UnrolledLoopStatement::inlineScan(InlineScanState *iss) -{ - for (size_t i = 0; i < statements->dim; i++) - { Statement *s = (*statements)[i]; - if (s) - (*statements)[i] = s->inlineScan(iss); + void visit(UnrolledLoopStatement *s) + { + for (size_t i = 0; i < s->statements->dim; i++) + { + inlineScan(&(*s->statements)[i]); + } } - return this; -} - -Statement *ScopeStatement::inlineScan(InlineScanState *iss) -{ - if (statement) - statement = statement->inlineScan(iss); - return this; -} - -Statement *WhileStatement::inlineScan(InlineScanState *iss) -{ - condition = condition->inlineScan(iss); - body = body ? body->inlineScan(iss) : NULL; - return this; -} - - -Statement *DoStatement::inlineScan(InlineScanState *iss) -{ - body = body ? body->inlineScan(iss) : NULL; - condition = condition->inlineScan(iss); - return this; -} - - -Statement *ForStatement::inlineScan(InlineScanState *iss) -{ - if (init) - init = init->inlineScan(iss); - if (condition) - condition = condition->inlineScan(iss); - if (increment) - increment = increment->inlineScan(iss); - if (body) - body = body->inlineScan(iss); - return this; -} + void visit(ScopeStatement *s) + { + inlineScan(&s->statement); + } -Statement *ForeachStatement::inlineScan(InlineScanState *iss) -{ - aggr = aggr->inlineScan(iss); - if (body) - body = body->inlineScan(iss); - return this; -} + void visit(WhileStatement *s) + { + s->condition = s->condition->inlineScan(iss); + inlineScan(&s->body); + } + void visit(DoStatement *s) + { + inlineScan(&s->body); + s->condition = s->condition->inlineScan(iss); + } -Statement *ForeachRangeStatement::inlineScan(InlineScanState *iss) -{ - lwr = lwr->inlineScan(iss); - upr = upr->inlineScan(iss); - if (body) - body = body->inlineScan(iss); - return this; -} + void visit(ForStatement *s) + { + inlineScan(&s->init); + if (s->condition) + s->condition = s->condition->inlineScan(iss); + if (s->increment) + s->increment = s->increment->inlineScan(iss); + inlineScan(&s->body); + } + void visit(ForeachStatement *s) + { + s->aggr = s->aggr->inlineScan(iss); + inlineScan(&s->body); + } -Statement *IfStatement::inlineScan(InlineScanState *iss) -{ - condition = condition->inlineScan(iss); - if (ifbody) - ifbody = ifbody->inlineScan(iss); - if (elsebody) - elsebody = elsebody->inlineScan(iss); - return this; -} + void visit(ForeachRangeStatement *s) + { + s->lwr = s->lwr->inlineScan(iss); + s->upr = s->upr->inlineScan(iss); + inlineScan(&s->body); + } + void visit(IfStatement *s) + { + s->condition = s->condition->inlineScan(iss); + inlineScan(&s->ifbody); + inlineScan(&s->elsebody); + } -Statement *SwitchStatement::inlineScan(InlineScanState *iss) -{ - //printf("SwitchStatement::inlineScan()\n"); - condition = condition->inlineScan(iss); - body = body ? body->inlineScan(iss) : NULL; - if (sdefault) - sdefault = (DefaultStatement *)sdefault->inlineScan(iss); - if (cases) - { - for (size_t i = 0; i < cases->dim; i++) - { CaseStatement *s; - - s = (*cases)[i]; - (*cases)[i] = (CaseStatement *)s->inlineScan(iss); + void visit(SwitchStatement *s) + { + //printf("SwitchStatement::inlineScan()\n"); + s->condition = s->condition->inlineScan(iss); + inlineScan(&s->body); + Statement *sdefault = s->sdefault; + inlineScan(&sdefault); + s->sdefault = (DefaultStatement *)sdefault; + if (s->cases) + { + for (size_t i = 0; i < s->cases->dim; i++) + { + Statement *scase = (*s->cases)[i]; + inlineScan(&scase); + (*s->cases)[i] = (CaseStatement *)scase; + } } } - return this; -} - - -Statement *CaseStatement::inlineScan(InlineScanState *iss) -{ - //printf("CaseStatement::inlineScan()\n"); - exp = exp->inlineScan(iss); - if (statement) - statement = statement->inlineScan(iss); - return this; -} - - -Statement *DefaultStatement::inlineScan(InlineScanState *iss) -{ - if (statement) - statement = statement->inlineScan(iss); - return this; -} - - -Statement *ReturnStatement::inlineScan(InlineScanState *iss) -{ - //printf("ReturnStatement::inlineScan()\n"); - if (exp) - exp = exp->inlineScan(iss); - return this; -} - -Statement *SynchronizedStatement::inlineScan(InlineScanState *iss) -{ - if (exp) - exp = exp->inlineScan(iss); - if (body) - body = body->inlineScan(iss); - return this; -} + void visit(CaseStatement *s) + { + //printf("CaseStatement::inlineScan()\n"); + s->exp = s->exp->inlineScan(iss); + inlineScan(&s->statement); + } + void visit(DefaultStatement *s) + { + inlineScan(&s->statement); + } -Statement *WithStatement::inlineScan(InlineScanState *iss) -{ - if (exp) - exp = exp->inlineScan(iss); - if (body) - body = body->inlineScan(iss); - return this; -} + void visit(ReturnStatement *s) + { + //printf("ReturnStatement::inlineScan()\n"); + if (s->exp) + s->exp = s->exp->inlineScan(iss); + } + void visit(SynchronizedStatement *s) + { + if (s->exp) + s->exp = s->exp->inlineScan(iss); + inlineScan(&s->body); + } -Statement *TryCatchStatement::inlineScan(InlineScanState *iss) -{ - if (body) - body = body->inlineScan(iss); - if (catches) + void visit(WithStatement *s) { - for (size_t i = 0; i < catches->dim; i++) - { Catch *c = (*catches)[i]; + if (s->exp) + s->exp = s->exp->inlineScan(iss); + inlineScan(&s->body); + } - if (c->handler) - c->handler = c->handler->inlineScan(iss); + void visit(TryCatchStatement *s) + { + inlineScan(&s->body); + if (s->catches) + { + for (size_t i = 0; i < s->catches->dim; i++) + { + Catch *c = (*s->catches)[i]; + inlineScan(&c->handler); + } } } - return this; -} - - -Statement *TryFinallyStatement::inlineScan(InlineScanState *iss) -{ - if (body) - body = body->inlineScan(iss); - if (finalbody) - finalbody = finalbody->inlineScan(iss); - return this; -} + void visit(TryFinallyStatement *s) + { + inlineScan(&s->body); + inlineScan(&s->finalbody); + } -Statement *ThrowStatement::inlineScan(InlineScanState *iss) -{ - if (exp) - exp = exp->inlineScan(iss); - return this; -} + void visit(ThrowStatement *s) + { + if (s->exp) + s->exp = s->exp->inlineScan(iss); + } + void visit(LabelStatement *s) + { + inlineScan(&s->statement); + } -Statement *LabelStatement::inlineScan(InlineScanState *iss) -{ - if (statement) - statement = statement->inlineScan(iss); - return this; -} + void inlineScan(Statement **s) + { + if (!*s) return; + Statement *save = result; + result = NULL; + (*s)->accept(this); + if (result) + *s = result; + result = save; + } +}; /* -------------------------- */ @@ -1523,7 +1493,8 @@ void FuncDeclaration::inlineScan() if (fbody && !naked) { inlineNest++; - fbody = fbody->inlineScan(&iss); + InlineScanVisitor v(&iss); + v.inlineScan(&fbody); inlineNest--; } } diff --git a/src/statement.h b/src/statement.h index 07f7075d6541..4fd91565962e 100644 --- a/src/statement.h +++ b/src/statement.h @@ -122,7 +122,6 @@ class Statement : public RootObject virtual Expression *doInline(InlineDoState *ids); virtual Statement *doInlineStatement(InlineDoState *ids); - virtual Statement *inlineScan(InlineScanState *iss); // Avoid dynamic_cast virtual ErrorStatement *isErrorStatement() { return NULL; } @@ -182,7 +181,6 @@ class ExpStatement : public Statement Expression *doInline(InlineDoState *ids); Statement *doInlineStatement(InlineDoState *ids); - Statement *inlineScan(InlineScanState *iss); ExpStatement *isExpStatement() { return this; } void accept(Visitor *v) { v->visit(this); } @@ -238,7 +236,6 @@ class CompoundStatement : public Statement Expression *doInline(InlineDoState *ids); Statement *doInlineStatement(InlineDoState *ids); - Statement *inlineScan(InlineScanState *iss); CompoundStatement *isCompoundStatement() { return this; } void accept(Visitor *v) { v->visit(this); } @@ -274,7 +271,6 @@ class UnrolledLoopStatement : public Statement Expression *doInline(InlineDoState *ids); Statement *doInlineStatement(InlineDoState *ids); - Statement *inlineScan(InlineScanState *iss); void accept(Visitor *v) { v->visit(this); } }; @@ -300,7 +296,6 @@ class ScopeStatement : public Statement Expression *doInline(InlineDoState *ids); Statement *doInlineStatement(InlineDoState *ids); - Statement *inlineScan(InlineScanState *iss); void accept(Visitor *v) { v->visit(this); } }; @@ -322,8 +317,6 @@ class WhileStatement : public Statement void ctfeCompile(CompiledCtfeFunction *ccf); void toCBuffer(OutBuffer *buf, HdrGenState *hgs); - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -344,8 +337,6 @@ class DoStatement : public Statement void ctfeCompile(CompiledCtfeFunction *ccf); void toCBuffer(OutBuffer *buf, HdrGenState *hgs); - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -375,7 +366,6 @@ class ForStatement : public Statement void ctfeCompile(CompiledCtfeFunction *ccf); void toCBuffer(OutBuffer *buf, HdrGenState *hgs); - Statement *inlineScan(InlineScanState *iss); Statement *doInlineStatement(InlineDoState *ids); void accept(Visitor *v) { v->visit(this); } @@ -411,8 +401,6 @@ class ForeachStatement : public Statement void ctfeCompile(CompiledCtfeFunction *ccf); void toCBuffer(OutBuffer *buf, HdrGenState *hgs); - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -439,8 +427,6 @@ class ForeachRangeStatement : public Statement void ctfeCompile(CompiledCtfeFunction *ccf); void toCBuffer(OutBuffer *buf, HdrGenState *hgs); - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -466,7 +452,6 @@ class IfStatement : public Statement Expression *doInline(InlineDoState *ids); Statement *doInlineStatement(InlineDoState *ids); - Statement *inlineScan(InlineScanState *iss); void accept(Visitor *v) { v->visit(this); } }; @@ -545,8 +530,6 @@ class SwitchStatement : public Statement void ctfeCompile(CompiledCtfeFunction *ccf); void toCBuffer(OutBuffer *buf, HdrGenState *hgs); - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -571,8 +554,6 @@ class CaseStatement : public Statement void toCBuffer(OutBuffer *buf, HdrGenState *hgs); CaseStatement *isCaseStatement() { return this; } - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -612,8 +593,6 @@ class DefaultStatement : public Statement void toCBuffer(OutBuffer *buf, HdrGenState *hgs); DefaultStatement *isDefaultStatement() { return this; } - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -677,7 +656,6 @@ class ReturnStatement : public Statement Expression *doInline(InlineDoState *ids); Statement *doInlineStatement(InlineDoState *ids); - Statement *inlineScan(InlineScanState *iss); ReturnStatement *isReturnStatement() { return this; } void accept(Visitor *v) { v->visit(this); } @@ -731,8 +709,6 @@ class SynchronizedStatement : public Statement bool apply(sapply_fp_t fp, void *param); void toCBuffer(OutBuffer *buf, HdrGenState *hgs); - Statement *inlineScan(InlineScanState *iss); - // Back end elem *esync; SynchronizedStatement(Loc loc, elem *esync, Statement *body); @@ -755,8 +731,6 @@ class WithStatement : public Statement bool apply(sapply_fp_t fp, void *param); void ctfeCompile(CompiledCtfeFunction *ccf); - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -776,8 +750,6 @@ class TryCatchStatement : public Statement bool apply(sapply_fp_t fp, void *param); void ctfeCompile(CompiledCtfeFunction *ccf); - Statement *inlineScan(InlineScanState *iss); - void toCBuffer(OutBuffer *buf, HdrGenState *hgs); void accept(Visitor *v) { v->visit(this); } }; @@ -819,8 +791,6 @@ class TryFinallyStatement : public Statement bool apply(sapply_fp_t fp, void *param); void ctfeCompile(CompiledCtfeFunction *ccf); - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -859,8 +829,6 @@ class ThrowStatement : public Statement Expression *interpret(InterState *istate); void ctfeCompile(CompiledCtfeFunction *ccf); - Statement *inlineScan(InlineScanState *iss); - void accept(Visitor *v) { v->visit(this); } }; @@ -922,7 +890,6 @@ class LabelStatement : public Statement void ctfeCompile(CompiledCtfeFunction *ccf); void toCBuffer(OutBuffer *buf, HdrGenState *hgs); - Statement *inlineScan(InlineScanState *iss); LabelStatement *isLabelStatement() { return this; } void accept(Visitor *v) { v->visit(this); } @@ -960,7 +927,6 @@ class AsmStatement : public Statement void toCBuffer(OutBuffer *buf, HdrGenState *hgs); //Expression *doInline(InlineDoState *ids); - //Statement *inlineScan(InlineScanState *iss); void accept(Visitor *v) { v->visit(this); } };