X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Felaboration%2Fmatching%2FPatternMatchingCompiler.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Felaboration%2Fmatching%2FPatternMatchingCompiler.java;h=64bf7053b14d0526310fc0fcb4eae4fe149f2b7a;hp=62b2ec1aaf4bc9894d14d8dabb957c80b234853f;hb=91682baa9a8252390f09b80fd724f47e5957b234;hpb=3826e289058a51d09310b7ba1251e959dc0ed3d0 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java index 62b2ec1aa..64bf7053b 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java @@ -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 rows, int columnId) { + private static void splitByConstructors(long location, CodeWriter w, final CompilationContext context, IVal[] scrutinee, final ICont success, ICont failure, List rows, int columnId) { THashMap matrixMap = new THashMap(); ArrayList branches = new ArrayList(); ArrayList matrices = new ArrayList(); @@ -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 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 rows) { + public static void split(long location, CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont success, ICont failure, List 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)); } }