# HG changeset patch # User korDen # Date 1285235720 -14400 # Node ID fe932c1a956398c08e9f3e5e2c442fe1d382a1c4 # Parent 438eaa11eed4e15d4aa5a0df30407a7ee7d902ef *.interpret functions implemenation diff -r 438eaa11eed4 -r fe932c1a9563 dmd/CaseStatement.d --- 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) diff -r 438eaa11eed4 -r fe932c1a9563 dmd/CommaExp.d --- 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) diff -r 438eaa11eed4 -r fe932c1a9563 dmd/FileExp.d --- 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) diff -r 438eaa11eed4 -r fe932c1a9563 dmd/Lexer.d --- 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) diff -r 438eaa11eed4 -r fe932c1a9563 dmd/SuperExp.d --- 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) diff -r 438eaa11eed4 -r fe932c1a9563 dmd/UnrolledLoopStatement.d --- 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)