Mercurial > projects > ddmd
diff dmd/DoStatement.d @ 155:a43c65469219
+ Statement.interpret()
+ ContinueStatement.interpret()
+ DoStatement.interpret()
author | trass3r |
---|---|
date | Wed, 15 Sep 2010 17:31:22 +0200 |
parents | e28b18c23469 |
children | af724d3510d7 |
line wrap: on
line diff
--- 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)