Mercurial > projects > ddmd
changeset 155:a43c65469219
+ Statement.interpret()
+ ContinueStatement.interpret()
+ DoStatement.interpret()
author | trass3r |
---|---|
date | Wed, 15 Sep 2010 17:31:22 +0200 |
parents | 14feb7ae01a6 |
children | 0c8cc2a10f99 |
files | dmd/ContinueStatement.d dmd/DoStatement.d dmd/ExpStatement.d dmd/ReturnStatement.d dmd/Statement.d |
diffstat | 5 files changed, 94 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- 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()
--- 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)
--- 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);
--- 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) {
--- 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