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)