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;
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;
return newVals;
}
- private static void splitByConstructors(CodeWriter w, final Environment env, IVal[] scrutinee, ICont failure, List<Row2> rows, int columnId) {
+ private static void splitByConstructors(CodeWriter w, final CompilationContext context, IVal[] scrutinee, ICont failure, List<Row2> rows, int columnId) {
THashMap<Object, ExpressionMatrix> matrixMap = new THashMap<Object, ExpressionMatrix>();
ArrayList<Branch> branches = new ArrayList<Branch>();
ArrayList<ExpressionMatrix> matrices = new ArrayList<ExpressionMatrix>();
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 {
} 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)
}
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<Row2> rows, int viewPatternColumn) {
+ private static void splitByViewPattern(CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont failure, List<Row2> rows, int viewPatternColumn) {
Row2 firstRow = rows.get(0);
EViewPattern firstViewPattern = (EViewPattern)firstRow.patterns[viewPatternColumn];
firstRow.patterns[viewPatternColumn] = firstViewPattern.pattern;
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<Row2> rows) {
+ public static void split(CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont failure, List<Row2> rows) {
Row2 firstRow = rows.get(0);
Expression[] patterns = firstRow.patterns;
if(scrutinee.length != patterns.length)
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;
}