changeset 18962:cfb85e1f4ca5

Prevent polluting SLFunctionRegistry (via SLNodeFactory.createRead()) with LHS names of assignment
author Paul Woegerer <paul.woegerer@oracle.com>
date Tue, 27 Jan 2015 14:24:59 +0100
parents afa70d3e8159
children 892e466d28f3
files graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.frame graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg
diffstat 4 files changed, 44 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- 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;
     }
 
     /**
--- 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
--- 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<SLExpressionNode> 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;
--- 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<out SLExpressionNode result>
 =                                               (. result = null; .)
 (
-    identifier                                  (. result = factory.createRead(t); .)
-    [
-        MemberExpression<out result, result, null, t>
-    ]
+    identifier
+    (
+        MemberExpression<out result, null, null, t>
+    |
+                                                (. result = factory.createRead(t); .)
+    )
 |
     stringLiteral                               (. result = factory.createStringLiteral(t); .)
 |
@@ -219,12 +221,16 @@
 .
 
 
-MemberExpression<out SLExpressionNode result, SLExpressionNode receiver, SLExpressionNode assignmentReceiver, Token assignmentName>
+MemberExpression<out SLExpressionNode result, SLExpressionNode r, SLExpressionNode assignmentReceiver, Token assignmentName>
 =                                               (. result = null;
+                                                   SLExpressionNode receiver = r;
                                                    Token nestedAssignmentName = null; .)
 (
     "("                                         (. List<SLExpressionNode> parameters = new ArrayList<>();
-                                                   SLExpressionNode parameter; .)
+                                                   SLExpressionNode parameter;
+                                                   if (receiver == null) {
+                                                       receiver = factory.createRead(assignmentName); 
+                                                   } .)
     [
         Expression<out parameter>               (. 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; .)