]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java
SCL compiler generates line numbers to bytecode
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / elaboration / matching / PatternMatchingCompiler.java
index 62b2ec1aaf4bc9894d14d8dabb957c80b234853f..64bf7053b14d0526310fc0fcb4eae4fe149f2b7a 100644 (file)
@@ -55,7 +55,7 @@ public class PatternMatchingCompiler {
         return newVals;
     }
 
-    private static void splitByConstructors(CodeWriter w, final CompilationContext context, IVal[] scrutinee, final ICont success, ICont failure, List<Row> rows, int columnId) {
+    private static void splitByConstructors(long location, CodeWriter w, final CompilationContext context, IVal[] scrutinee, final ICont success, ICont failure, List<Row> rows, int columnId) {
         THashMap<Object, ExpressionMatrix> matrixMap = new THashMap<Object, ExpressionMatrix>();
         ArrayList<Branch> branches = new ArrayList<Branch>();
         ArrayList<ExpressionMatrix> matrices = new ArrayList<ExpressionMatrix>();
@@ -168,7 +168,7 @@ public class PatternMatchingCompiler {
             CodeWriter newW = w.createBlock();
             ICont cont = newW.getContinuation();
             branches.add(new Branch(null, cont));
-            split(newW, context, scrutinee, success, failure, rows.subList(i, rows.size()));
+            split(location, newW, context, scrutinee, success, failure, rows.subList(i, rows.size()));
             failure = cont;
         }
         else {
@@ -186,11 +186,11 @@ public class PatternMatchingCompiler {
         }
 
         for(ExpressionMatrix mx : matrices)
-            split(mx.w, context, mx.scrutinee, success, failure, mx.rows);
-        w.switch_(scrutinee[columnId], branches.toArray(new Branch[branches.size()]));
+            split(location, mx.w, context, mx.scrutinee, success, failure, mx.rows);
+        w.switch_(location, scrutinee[columnId], branches.toArray(new Branch[branches.size()]));
     }
 
-    private static void splitByViewPattern(CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont success,
+    private static void splitByViewPattern(long location, CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont success,
             ICont failure, List<Row> rows, int viewPatternColumn) {
         Row firstRow = rows.get(0);
         EViewPattern firstViewPattern = (EViewPattern)firstRow.patterns[viewPatternColumn];
@@ -225,16 +225,16 @@ public class PatternMatchingCompiler {
                         firstViewPattern.expression.toVal(context, w),
                         scrutinee[viewPatternColumn]);
         if(i == rows.size()) {
-            split(w, context, newScrutinee, success, failure, rows);
+            split(location, w, context, newScrutinee, success, failure, rows);
         }
         else {
             CodeWriter cont = w.createBlock();
-            split(w, context, newScrutinee, success, cont.getContinuation(), rows.subList(0, i));
-            split(cont, context, scrutinee, success, failure, rows.subList(i, rows.size()));
+            split(location, w, context, newScrutinee, success, cont.getContinuation(), rows.subList(0, i));
+            split(location, cont, context, scrutinee, success, failure, rows.subList(i, rows.size()));
         }
     }
 
-    public static void split(CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont success, ICont failure, List<Row> rows) {
+    public static void split(long location, CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont success, ICont failure, List<Row> rows) {
         Row firstRow = rows.get(0);
         Expression[] patterns = firstRow.patterns;
         if(scrutinee.length != patterns.length)
@@ -249,13 +249,13 @@ public class PatternMatchingCompiler {
                     viewPatternColumn = i;
             }
             else if(!(pattern instanceof EVariable)) {
-                splitByConstructors(w, context, scrutinee, success, failure, rows, i);
+                splitByConstructors(location, w, context, scrutinee, success, failure, rows, i);
                 return;
             }
         }
         
         if(viewPatternColumn >= 0) {
-            splitByViewPattern(w, context, scrutinee, success, failure, rows, viewPatternColumn);
+            splitByViewPattern(location, w, context, scrutinee, success, failure, rows, viewPatternColumn);
             return;
         }
 
@@ -271,10 +271,10 @@ public class PatternMatchingCompiler {
                 CodeWriter newW = w.createBlock();            
                 ICont cont = newW.getContinuation();
                 group.compile(context, w, success, cont);
-                split(newW, context, scrutinee, success, failure, rows.subList(1, rows.size()));
+                split(location, newW, context, scrutinee, success, failure, rows.subList(1, rows.size()));
             }
         }
         else
-            w.jump(success, firstRow.value.toVal(context, w));
+            w.jump(location, success, firstRow.value.toVal(context, w));
     }
 }