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%2Fmatching2%2FPatternMatchingCompiler2.java;h=8ca51b275f900a439d5b7a5025ab3d2e96444588;hp=bd904cf28ef52bbc5e7ddc058a1a9fe28978a672;hb=862c09c9608329f326404342d12da61792eece2c;hpb=695ffae899b981f31695e5fdd30ac8fed9fe84b8 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching2/PatternMatchingCompiler2.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching2/PatternMatchingCompiler2.java index bd904cf28..8ca51b275 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching2/PatternMatchingCompiler2.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching2/PatternMatchingCompiler2.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.List; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; +import org.simantics.scl.compiler.compilation.CompilationContext; import org.simantics.scl.compiler.constants.Constant; import org.simantics.scl.compiler.elaboration.expressions.EApply; import org.simantics.scl.compiler.elaboration.expressions.EApplyType; @@ -17,7 +18,6 @@ import org.simantics.scl.compiler.elaboration.expressions.EViewPattern; import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.elaboration.modules.SCLValue; import org.simantics.scl.compiler.elaboration.modules.TypeConstructor; -import org.simantics.scl.compiler.environment.Environment; import org.simantics.scl.compiler.internal.codegen.continuations.Branch; import org.simantics.scl.compiler.internal.codegen.continuations.ICont; import org.simantics.scl.compiler.internal.codegen.references.IVal; @@ -53,7 +53,7 @@ public class PatternMatchingCompiler2 { return newVals; } - private static void splitByConstructors(CodeWriter w, final Environment env, IVal[] scrutinee, ICont failure, List rows, int columnId) { + private static void splitByConstructors(CodeWriter w, final CompilationContext context, IVal[] scrutinee, ICont failure, List rows, int columnId) { THashMap matrixMap = new THashMap(); ArrayList branches = new ArrayList(); ArrayList matrices = new ArrayList(); @@ -166,7 +166,7 @@ public class PatternMatchingCompiler2 { CodeWriter newW = w.createBlock(); ICont cont = newW.getContinuation(); branches.add(new Branch(null, cont)); - split(newW, env, scrutinee, failure, rows.subList(i, rows.size())); + split(newW, context, scrutinee, failure, rows.subList(i, rows.size())); failure = cont; } else { @@ -176,7 +176,7 @@ public class PatternMatchingCompiler2 { } catch (MatchException e) { throw new InternalCompilerError(e); } - TypeConstructor cons = (TypeConstructor)env.getTypeDescriptor(con); + TypeConstructor cons = (TypeConstructor)context.environment.getTypeDescriptor(con); int maxBranchCount = cons.isOpen ? Integer.MAX_VALUE : cons.constructors.length; if(branches.size() < maxBranchCount) @@ -184,11 +184,11 @@ public class PatternMatchingCompiler2 { } for(ExpressionMatrix mx : matrices) - split(mx.w, env, mx.scrutinee, failure, mx.rows); + split(mx.w, context, mx.scrutinee, failure, mx.rows); w.switch_(scrutinee[columnId], branches.toArray(new Branch[branches.size()])); } - private static void splitByViewPattern(CodeWriter w, Environment env, IVal[] scrutinee, ICont failure, List rows, int viewPatternColumn) { + private static void splitByViewPattern(CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont failure, List rows, int viewPatternColumn) { Row2 firstRow = rows.get(0); EViewPattern firstViewPattern = (EViewPattern)firstRow.patterns[viewPatternColumn]; firstRow.patterns[viewPatternColumn] = firstViewPattern.pattern; @@ -219,19 +219,19 @@ public class PatternMatchingCompiler2 { IVal[] newScrutinee = Arrays.copyOf(scrutinee, scrutinee.length); newScrutinee[viewPatternColumn] = w.apply(firstViewPattern.location, - firstViewPattern.expression.toVal(env, w), + firstViewPattern.expression.toVal(context, w), scrutinee[viewPatternColumn]); if(i == rows.size()) { - split(w, env, newScrutinee, failure, rows); + split(w, context, newScrutinee, failure, rows); } else { CodeWriter cont = w.createBlock(); - split(w, env, newScrutinee, cont.getContinuation(), rows.subList(0, i)); - split(cont, env, scrutinee, failure, rows.subList(i, rows.size())); + split(w, context, newScrutinee, cont.getContinuation(), rows.subList(0, i)); + split(cont, context, scrutinee, failure, rows.subList(i, rows.size())); } } - public static void split(CodeWriter w, Environment env, IVal[] scrutinee, ICont failure, List rows) { + public static void split(CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont failure, List rows) { Row2 firstRow = rows.get(0); Expression[] patterns = firstRow.patterns; if(scrutinee.length != patterns.length) @@ -246,13 +246,13 @@ public class PatternMatchingCompiler2 { viewPatternColumn = i; } else if(!(pattern instanceof EVariable)) { - splitByConstructors(w, env, scrutinee, failure, rows, i); + splitByConstructors(w, context, scrutinee, failure, rows, i); return; } } if(viewPatternColumn >= 0) { - splitByViewPattern(w, env, scrutinee, failure, rows, viewPatternColumn); + splitByViewPattern(w, context, scrutinee, failure, rows, viewPatternColumn); return; }