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.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.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, final ICont success, ICont failure, List<Row> rows, int columnId) {
+ private static void splitByConstructors(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, env, scrutinee, success, failure, rows.subList(i, rows.size()));
+ split(newW, context, scrutinee, success, failure, rows.subList(i, rows.size()));
failure = cont;
}
else {
} catch (MatchException e) {
throw new InternalCompilerError();
}
- 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, success, failure, mx.rows);
+ split(mx.w, context, mx.scrutinee, success, failure, mx.rows);
w.switch_(scrutinee[columnId], branches.toArray(new Branch[branches.size()]));
}
- private static void splitByViewPattern(CodeWriter w, Environment env, IVal[] scrutinee, ICont success,
+ private static void splitByViewPattern(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];
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, success, failure, rows);
+ split(w, context, newScrutinee, success, failure, rows);
}
else {
CodeWriter cont = w.createBlock();
- split(w, env, newScrutinee, success, cont.getContinuation(), rows.subList(0, i));
- split(cont, env, scrutinee, success, failure, rows.subList(i, rows.size()));
+ split(w, context, newScrutinee, success, cont.getContinuation(), rows.subList(0, i));
+ split(cont, context, scrutinee, success, failure, rows.subList(i, rows.size()));
}
}
- public static void split(CodeWriter w, Environment env, IVal[] scrutinee, ICont success, ICont failure, List<Row> rows) {
+ public static void split(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, env, scrutinee, success, failure, rows, i);
+ splitByConstructors(w, context, scrutinee, success, failure, rows, i);
return;
}
}
if(viewPatternColumn >= 0) {
- splitByViewPattern(w, env, scrutinee, success, failure, rows, viewPatternColumn);
+ splitByViewPattern(w, context, scrutinee, success, failure, rows, viewPatternColumn);
return;
}
if(firstRow.value instanceof GuardedExpressionGroup) {
GuardedExpressionGroup group = (GuardedExpressionGroup)firstRow.value;
if(rows.size() == 1) {
- group.compile(env, w, success, failure);
+ group.compile(context, w, success, failure);
}
else {
CodeWriter newW = w.createBlock();
ICont cont = newW.getContinuation();
- group.compile(env, w, success, cont);
- split(newW, env, scrutinee, success, failure, rows.subList(1, rows.size()));
+ group.compile(context, w, success, cont);
+ split(newW, context, scrutinee, success, failure, rows.subList(1, rows.size()));
}
}
else
- w.jump(success, firstRow.value.toVal(env, w));
+ w.jump(success, firstRow.value.toVal(context, w));
}
}