changeset 163:fe932c1a9563

*.interpret functions implemenation
author korDen
date Thu, 23 Sep 2010 13:55:20 +0400
parents 438eaa11eed4
children 8bf07a566fdf
files dmd/CaseStatement.d dmd/CommaExp.d dmd/FileExp.d dmd/Lexer.d dmd/SuperExp.d dmd/UnrolledLoopStatement.d
diffstat 6 files changed, 121 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/CaseStatement.d	Tue Sep 21 14:59:56 2010 +0400
+++ b/dmd/CaseStatement.d	Thu Sep 23 13:55:20 2010 +0400
@@ -145,7 +145,15 @@
 	
     override Expression interpret(InterState istate)
 	{
-		assert(false);
+	version (LOG) {
+		printf("CaseStatement.interpret(%s) this = %p\n", exp.toChars(), this);
+	}
+		if (istate.start is this)
+			istate.start = null;
+		if (statement)
+			return statement.interpret(istate);
+		else
+			return null;
 	}
 	
     override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
--- a/dmd/CommaExp.d	Tue Sep 21 14:59:56 2010 +0400
+++ b/dmd/CommaExp.d	Thu Sep 23 13:55:20 2010 +0400
@@ -7,6 +7,7 @@
 import dmd.Scope;
 import dmd.IntRange;
 import dmd.Expression;
+import dmd.GlobalExpressions;
 import dmd.MATCH;
 import dmd.WANT;
 import dmd.TOK;
@@ -126,7 +127,13 @@
 	
     override Expression interpret(InterState istate)
 	{	
-		assert(false);
+version (LOG) {
+		printf("CommaExp.interpret() %.*s\n", toChars());
+}
+		Expression e = e1.interpret(istate);
+		if (e !is EXP_CANT_INTERPRET)
+			e = e2.interpret(istate);
+		return e;
 	}
 	
     override elem* toElem(IRState* irs)
--- a/dmd/FileExp.d	Tue Sep 21 14:59:56 2010 +0400
+++ b/dmd/FileExp.d	Thu Sep 23 13:55:20 2010 +0400
@@ -2,13 +2,20 @@
 
 import dmd.common;
 import dmd.Expression;
+import dmd.File;
 import dmd.UnaExp;
+import dmd.StringExp;
+import dmd.WANT;
+import dmd.Global;
+import dmd.FileName;
 import dmd.OutBuffer;
 import dmd.Loc;
 import dmd.Scope;
 import dmd.HdrGenState;
 import dmd.TOK;
 
+import core.stdc.stdio;
+
 class FileExp : UnaExp
 {
 	this(Loc loc, Expression e)
@@ -18,7 +25,65 @@
 
 	override Expression semantic(Scope sc)
 	{
-		assert(false);
+		StringExp se;
+
+	version (LOGSEMANTIC) {
+		printf("FileExp.semantic('%.*s')\n", toChars());
+	}
+		UnaExp.semantic(sc);
+		e1 = resolveProperties(sc, e1);
+		e1 = e1.optimize(WANTvalue);
+		if (e1.op != TOKstring)
+		{	
+			error("file name argument must be a string, not (%s)", e1.toChars());
+			goto Lerror;
+		}
+		se = cast(StringExp)e1;
+		se = se.toUTF8(sc);
+
+		string name = (cast(immutable(char)*)se.string_)[0..se.len];
+
+		if (!global.params.fileImppath)
+		{	
+			error("need -Jpath switch to import text file %s", name);
+			goto Lerror;
+		}
+
+		if (name != FileName.name(name))
+		{	
+			error("use -Jpath switch to provide path for filename %s", name);
+			goto Lerror;
+		}
+
+		name = FileName.searchPath(global.filePath, name, 0);
+		if (!name)
+		{	
+			error("file %s cannot be found, check -Jpath", se.toChars());
+			goto Lerror;
+		}
+
+		if (global.params.verbose)
+			printf("file      %s\t(%s)\n", cast(char*)se.string_, name);
+
+		{	
+			scope File f = new File(name);
+			if (f.read())
+			{   
+				error("cannot read file %s", f.toChars());
+				goto Lerror;
+			}
+			else
+			{
+				f.ref_ = 1;
+				se = new StringExp(loc, (cast(immutable(char)*)f.buffer)[0..f.len]);
+			}
+		}
+	  Lret:
+		return se.semantic(sc);
+
+	  Lerror:
+		se = new StringExp(loc, "");
+		goto Lret;
 	}
 
 	override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
--- a/dmd/Lexer.d	Tue Sep 21 14:59:56 2010 +0400
+++ b/dmd/Lexer.d	Thu Sep 23 13:55:20 2010 +0400
@@ -884,9 +884,13 @@
 		return peek(&token).value;
 	}
 
+	/***********************
+	 * Look 2 tokens ahead at value.
+	 */
     TOK peekNext2()
 	{
-		assert(false);
+		Token* t = peek(&token);
+		return peek(t).value;
 	}
 
     void scan(Token* t)
--- a/dmd/SuperExp.d	Tue Sep 21 14:59:56 2010 +0400
+++ b/dmd/SuperExp.d	Thu Sep 23 13:55:20 2010 +0400
@@ -110,7 +110,7 @@
 
 	override void scanForNestedRef(Scope sc)
 	{
-		assert(false);
+		ThisExp.scanForNestedRef(sc);
 	}
 
 	override int inlineCost(InlineCostState* ics)
--- a/dmd/UnrolledLoopStatement.d	Tue Sep 21 14:59:56 2010 +0400
+++ b/dmd/UnrolledLoopStatement.d	Thu Sep 23 13:55:20 2010 +0400
@@ -1,6 +1,7 @@
 module dmd.UnrolledLoopStatement;
 
 import dmd.common;
+import dmd.GlobalExpressions;
 import dmd.Expression;
 import dmd.Statement;
 import dmd.InterState;
@@ -93,7 +94,37 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		Expression e = null;
+
+	version (LOG) {
+		printf("UnrolledLoopStatement.interpret()\n");
+	}
+		if (istate.start == this)
+			istate.start = null;
+		if (statements)
+		{
+			for (size_t i = 0; i < statements.dim; i++)
+			{   
+				Statement s = statements[i];
+
+				e = s.interpret(istate);
+				if (e is EXP_CANT_INTERPRET)
+					break;
+				if (e is EXP_CONTINUE_INTERPRET)
+				{	
+					e = null;
+					continue;
+				}
+				if (e is EXP_BREAK_INTERPRET)
+				{	
+					e = null;
+					break;
+				}
+				if (e)
+					break;
+			}
+		}
+		return e;
 	}
 
 	override void toCBuffer(OutBuffer buf, HdrGenState* hgs)