import org.simantics.scl.compiler.elaboration.expressions.EViewPattern;
import org.simantics.scl.compiler.elaboration.expressions.Expression;
import org.simantics.scl.compiler.elaboration.expressions.GuardedExpressionGroup;
+import org.simantics.scl.compiler.elaboration.java.DynamicConstructor;
import org.simantics.scl.compiler.elaboration.modules.SCLValue;
import org.simantics.scl.compiler.elaboration.modules.TypeConstructor;
import org.simantics.scl.compiler.internal.codegen.continuations.Branch;
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>();
if(constructor_ instanceof EConstant) {
SCLValue constructor = ((EConstant)constructor_).getValue();
- ExpressionMatrix matrix = matrixMap.get(constructor.getName());
+ ExpressionMatrix matrix = constructor.getValue() == DynamicConstructor.INSTANCE ? null : matrixMap.get(constructor.getName());
if(matrix == null) {
CodeWriter newW = w.createBlock(Types.getTypes(parameters));
branches.add(new Branch((Constant)constructor.getValue(), newW.getContinuation()));
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 {
}
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];
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)
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;
}
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));
}
}