1 package org.simantics.scl.compiler.elaboration.chr.plan;
\r
3 import java.util.ArrayList;
\r
5 import org.simantics.scl.compiler.compilation.CompilationContext;
\r
6 import org.simantics.scl.compiler.elaboration.expressions.Expression;
\r
7 import org.simantics.scl.compiler.internal.codegen.references.IVal;
\r
8 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
\r
9 import org.simantics.scl.compiler.internal.elaboration.matching2.PatternMatchingCompiler2;
\r
10 import org.simantics.scl.compiler.internal.elaboration.matching2.Row2;
\r
12 public class MatchOp extends PlanOp {
\r
13 public Expression scrutinee;
\r
14 public Expression pattern;
\r
16 public MatchOp(long location, Expression scrutinee, Expression pattern) {
\r
18 this.scrutinee = scrutinee;
\r
19 this.pattern = pattern;
\r
23 public void toString(StringBuilder b) {
\r
24 b.append("MATCH ").append(pattern).append(" = ").append(scrutinee);
\r
28 public void generateCode(CompilationContext context, PlanContext planContext, CodeWriter w) {
\r
29 CodeWriter body = w.createBlock();
\r
30 CodeWriter end = w.createBlock();
\r
32 IVal[] scrutineeVals = new IVal[1];
\r
33 scrutineeVals[0] = scrutinee.toVal(context.environment, w);
\r
35 ArrayList<Row2> rows = new ArrayList<Row2>(1);
\r
36 rows.add(new Row2(new Expression[] {pattern}, body.getContinuation()));
\r
38 PatternMatchingCompiler2.split(w, context.environment, scrutineeVals, end.getContinuation(), rows);
\r
40 planContext.nextOp(body);
\r
41 if(body.isUnfinished())
\r
42 body.jump(end.getContinuation());
\r