# HG changeset patch # User Paul Woegerer # Date 1422365099 -3600 # Node ID cfb85e1f4ca56dcc0048f08374ca8b5339b1f88b # Parent afa70d3e81594b3a0cc92c7216ad4552b9d3ac43 Prevent polluting SLFunctionRegistry (via SLNodeFactory.createRead()) with LHS names of assignment diff -r afa70d3e8159 -r cfb85e1f4ca5 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java Tue Jan 27 14:11:52 2015 +0100 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java Tue Jan 27 14:24:59 2015 +0100 @@ -140,7 +140,7 @@ * Parse and run the specified SL source. Factored out in a separate method so that it can also * be used by the unit test harness. */ - public static void run(SLContext context, Source source, PrintStream logOutput, int repeats) { + public static long run(SLContext context, Source source, PrintStream logOutput, int repeats) { if (logOutput != null) { logOutput.println("== running on " + Truffle.getRuntime().getName()); // logOutput.println("Source = " + source.getCode()); @@ -163,6 +163,7 @@ boolean dumpASTToIGV = false; printScript("before execution", context, logOutput, printASTToLog, printSourceAttributionToLog, dumpASTToIGV); + long totalRuntime = 0; try { for (int i = 0; i < repeats; i++) { long start = System.nanoTime(); @@ -176,6 +177,7 @@ context.getOutput().println(formatTypeError(ex)); } long end = System.nanoTime(); + totalRuntime += end - start; if (logOutput != null && repeats > 1) { logOutput.println("== iteration " + (i + 1) + ": " + ((end - start) / 1000000) + " ms"); @@ -185,7 +187,7 @@ } finally { printScript("after execution", context, logOutput, printASTToLog, printSourceAttributionToLog, dumpASTToIGV); } - return; + return totalRuntime; } /** diff -r afa70d3e8159 -r cfb85e1f4ca5 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.frame --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.frame Tue Jan 27 14:11:52 2015 +0100 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.frame Tue Jan 27 14:24:59 2015 +0100 @@ -39,8 +39,8 @@ // @formatter:off public class Parser { -->constants - static final boolean T = true; - static final boolean x = false; + static final boolean _T = true; + static final boolean _x = false; static final int minErrDist = 2; public Token t; // last recognized token diff -r afa70d3e8159 -r cfb85e1f4ca5 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java Tue Jan 27 14:11:52 2015 +0100 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java Tue Jan 27 14:24:59 2015 +0100 @@ -41,8 +41,8 @@ public static final int _numericLiteral = 3; public static final int maxT = 31; - static final boolean T = true; - static final boolean x = false; + static final boolean _T = true; + static final boolean _x = false; static final int minErrDist = 2; public Token t; // last recognized token @@ -345,10 +345,11 @@ result = null; if (la.kind == 1) { Get(); - result = factory.createRead(t); if (la.kind == 5 || la.kind == 29 || la.kind == 30) { - result = MemberExpression(result, null, t); - } + result = MemberExpression(null, null, t); + } else if (StartOf(4)) { + result = factory.createRead(t); + } else SynErr(33); } else if (la.kind == 2) { Get(); result = factory.createStringLiteral(t); @@ -363,18 +364,22 @@ Expect(7); int length = (t.charPos + t.val.length()) - start; result = factory.createParenExpression(expr, start, length); - } else SynErr(33); + } else SynErr(34); return result; } - SLExpressionNode MemberExpression(SLExpressionNode receiver, SLExpressionNode assignmentReceiver, Token assignmentName) { + SLExpressionNode MemberExpression(SLExpressionNode r, SLExpressionNode assignmentReceiver, Token assignmentName) { SLExpressionNode result; result = null; + SLExpressionNode receiver = r; Token nestedAssignmentName = null; if (la.kind == 5) { Get(); List parameters = new ArrayList<>(); SLExpressionNode parameter; + if (receiver == null) { + receiver = factory.createRead(assignmentName); + } if (StartOf(2)) { parameter = Expression(); parameters.add(parameter); @@ -399,10 +404,13 @@ } } else if (la.kind == 30) { Get(); + if (receiver == null) { + receiver = factory.createRead(assignmentName); + } Expect(1); result = factory.createReadProperty(receiver, t); nestedAssignmentName = t; - } else SynErr(34); + } else SynErr(35); if (la.kind == 5 || la.kind == 29 || la.kind == 30) { result = MemberExpression(result, receiver, nestedAssignmentName); } @@ -421,10 +429,11 @@ } private static final boolean[][] set = { - {T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x}, - {x,T,T,T, x,T,x,x, x,x,T,x, T,T,T,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x}, - {x,T,T,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x}, - {x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, T,T,T,T, T,x,x,x, x,x,x,x, x} + {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x}, + {_x,_T,_T,_T, _x,_T,_x,_x, _x,_x,_T,_x, _T,_T,_T,_x, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x}, + {_x,_T,_T,_T, _x,_T,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x}, + {_x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_T, _T,_T,_T,_T, _T,_x,_x,_x, _x,_x,_x,_x, _x}, + {_x,_x,_x,_x, _x,_T,_T,_T, _x,_x,_x,_T, _x,_x,_x,_x, _x,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_x, _x} }; @@ -501,7 +510,8 @@ case 31: s = "??? expected"; break; case 32: s = "invalid Statement"; break; case 33: s = "invalid Factor"; break; - case 34: s = "invalid MemberExpression"; break; + case 34: s = "invalid Factor"; break; + case 35: s = "invalid MemberExpression"; break; default: s = "error " + n; break; diff -r afa70d3e8159 -r cfb85e1f4ca5 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg Tue Jan 27 14:11:52 2015 +0100 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg Tue Jan 27 14:24:59 2015 +0100 @@ -202,10 +202,12 @@ Factor = (. result = null; .) ( - identifier (. result = factory.createRead(t); .) - [ - MemberExpression - ] + identifier + ( + MemberExpression + | + (. result = factory.createRead(t); .) + ) | stringLiteral (. result = factory.createStringLiteral(t); .) | @@ -219,12 +221,16 @@ . -MemberExpression +MemberExpression = (. result = null; + SLExpressionNode receiver = r; Token nestedAssignmentName = null; .) ( "(" (. List parameters = new ArrayList<>(); - SLExpressionNode parameter; .) + SLExpressionNode parameter; + if (receiver == null) { + receiver = factory.createRead(assignmentName); + } .) [ Expression (. parameters.add(parameter); .) { @@ -244,7 +250,9 @@ result = factory.createWriteProperty(assignmentReceiver, assignmentName, value); } .) | - "." + "." (. if (receiver == null) { + receiver = factory.createRead(assignmentName); + } .) identifier (. result = factory.createReadProperty(receiver, t); .) (. nestedAssignmentName = t; .)