# HG changeset patch # User trass3r # Date 1284564682 -7200 # Node ID a43c65469219b77c86ce840b170c6d6503d66cfa # Parent 14feb7ae01a6b289aa532368ffecd1a941174430 + Statement.interpret() + ContinueStatement.interpret() + DoStatement.interpret() diff -r 14feb7ae01a6 -r a43c65469219 dmd/ContinueStatement.d --- a/dmd/ContinueStatement.d Wed Sep 15 15:32:31 2010 +0200 +++ b/dmd/ContinueStatement.d Wed Sep 15 17:31:22 2010 +0200 @@ -1,8 +1,10 @@ module dmd.ContinueStatement; import dmd.common; +import dmd.interpret.Util; import dmd.Statement; import dmd.FuncDeclaration; +import dmd.GlobalExpressions; import dmd.IntegerExp; import dmd.ReturnStatement; import dmd.LabelStatement; @@ -109,7 +111,14 @@ override Expression interpret(InterState istate) { - assert(false); +version(LOG) + writef("ContinueStatement::interpret()\n"); + + mixin(START); + if (ident) + return EXP_CANT_INTERPRET; + else + return EXP_CONTINUE_INTERPRET; } override BE blockExit() diff -r 14feb7ae01a6 -r a43c65469219 dmd/DoStatement.d --- a/dmd/DoStatement.d Wed Sep 15 15:32:31 2010 +0200 +++ b/dmd/DoStatement.d Wed Sep 15 17:31:22 2010 +0200 @@ -6,6 +6,7 @@ import dmd.Loc; import dmd.Scope; import dmd.InterState; +import dmd.GlobalExpressions; import dmd.HdrGenState; import dmd.OutBuffer; import dmd.InlineScanState; @@ -100,7 +101,62 @@ override Expression interpret(InterState istate) { - assert(false); +version(LOG) + writef("DoStatement::interpret()\n"); + + if (istate.start == this) + istate.start = null; + Expression e; + + if (istate.start) + { + e = body_ ? body_.interpret(istate) : null; + if (istate.start) + return null; + if (e is EXP_CANT_INTERPRET) + return e; + if (e is EXP_BREAK_INTERPRET) + return null; + if (e is EXP_CONTINUE_INTERPRET) + goto Lcontinue; + if (e) + return e; + } + + while (1) + { + e = body_ ? body_.interpret(istate) : null; + if (e is EXP_CANT_INTERPRET) + break; + if (e is EXP_BREAK_INTERPRET) + { + e = null; + break; + } + if (e && e !is EXP_CONTINUE_INTERPRET) + break; + + Lcontinue: + e = condition.interpret(istate); + if (e is EXP_CANT_INTERPRET) + break; + if (!e.isConst()) + { + e = EXP_CANT_INTERPRET; + break; + } + if (e.isBool(true)) + { + } + else if (e.isBool(false)) + { + e = null; + break; + } + else + assert(0); + } + return e; } override void toCBuffer(OutBuffer buf, HdrGenState* hgs) diff -r 14feb7ae01a6 -r a43c65469219 dmd/ExpStatement.d --- a/dmd/ExpStatement.d Wed Sep 15 15:32:31 2010 +0200 +++ b/dmd/ExpStatement.d Wed Sep 15 17:31:22 2010 +0200 @@ -73,7 +73,7 @@ { printf("ExpStatement.interpret(%s)\n", exp ? exp.toChars() : ""); } - mixin(START!()); + mixin(START); if (exp) { Expression e = exp.interpret(istate); diff -r 14feb7ae01a6 -r a43c65469219 dmd/ReturnStatement.d --- a/dmd/ReturnStatement.d Wed Sep 15 15:32:31 2010 +0200 +++ b/dmd/ReturnStatement.d Wed Sep 15 17:31:22 2010 +0200 @@ -394,7 +394,7 @@ version (LOG) { printf("ReturnStatement.interpret(%s)\n", exp ? exp.toChars() : ""); } - mixin(START!()); + mixin(START); if (!exp) return EXP_VOID_INTERPRET; version (LOG) { diff -r 14feb7ae01a6 -r a43c65469219 dmd/Statement.d --- a/dmd/Statement.d Wed Sep 15 15:32:31 2010 +0200 +++ b/dmd/Statement.d Wed Sep 15 17:31:22 2010 +0200 @@ -22,19 +22,18 @@ import dmd.IRState; import dmd.BE; import dmd.Global; +import dmd.GlobalExpressions; import dmd.Util; -template START() -{ - enum START = q{ - if (istate.start) - { - if (istate.start != this) - return null; - istate.start = null; - } - }; -} +//! startup code used in *Statement.interpret() functions +enum START = ` + if (istate.start) + { + if (istate.start !is this) + return null; + istate.start = null; + } +`; class Statement { @@ -174,11 +173,23 @@ return null; } - Expression interpret(InterState istate) + /*********************************** + * Interpret the statement. + * Returns: + * null continue to next statement + * EXP_CANT_INTERPRET cannot interpret statement at compile time + * !null expression from return statement + */ + Expression interpret(InterState istate) { - assert(false); +version(LOG) + writef("Statement::interpret()\n"); + + mixin(START); + error("Statement %s cannot be interpreted at compile time", this.toChars()); + return EXP_CANT_INTERPRET; } - + int inlineCost(InlineCostState* ics) { return COST_MAX; // default is we can't inline it