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