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.constants.IntegerConstant;
\r
7 import org.simantics.scl.compiler.constants.JavaComparisonOperation;
\r
8 import org.simantics.scl.compiler.constants.singletons.IncreaseByOne;
\r
9 import org.simantics.scl.compiler.constants.singletons.ListElement;
\r
10 import org.simantics.scl.compiler.constants.singletons.ListLength;
\r
11 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
\r
12 import org.simantics.scl.compiler.elaboration.expressions.Variable;
\r
13 import org.simantics.scl.compiler.internal.codegen.continuations.ICont;
\r
14 import org.simantics.scl.compiler.internal.codegen.references.IVal;
\r
15 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
\r
16 import org.simantics.scl.compiler.types.Type;
\r
17 import org.simantics.scl.compiler.types.Types;
\r
19 public abstract class PlanContext {
\r
20 public CompilationContext context;
\r
21 public CHRRuleset ruleset;
\r
22 public IVal storeVar;
\r
23 public ArrayList<PartnerFact> partnerFacts = new ArrayList<PartnerFact>();
\r
24 public IVal currentId;
\r
26 public PlanContext(CompilationContext context, CHRRuleset ruleset, IVal storeVar) {
\r
27 this.context = context;
\r
28 this.ruleset = ruleset;
\r
29 this.storeVar = storeVar;
\r
32 public abstract void nextOp(CodeWriter w);
\r
34 public IVal generateNewId(long location, CodeWriter w) {
\r
35 if(currentId == null)
\r
36 currentId = w.apply(location, ruleset.readCurrentId, storeVar);
\r
37 IVal result = currentId;
\r
38 currentId = w.apply(location, IncreaseByOne.INSTANCE, currentId);
\r
42 public void iterateList(long location, CodeWriter w, Variable variable, IVal listValue) {
\r
43 Type componentType = variable.getType();
\r
44 IVal listLength = w.apply(location, ListLength.INSTANCE.createSpecialization(componentType), listValue);
\r
46 CodeWriter body = w.createBlock(Types.INTEGER);
\r
47 ICont bodyContinuation = body.getContinuation();
\r
48 CodeWriter end = w.createBlock();
\r
50 w.jump(body.getContinuation(), IntegerConstant.ZERO);
\r
52 IVal index = body.getParameters()[0];
\r
53 body.branchAwayIf(body.apply(location, JavaComparisonOperation.IEQUAL, index, listLength),
\r
54 end.getContinuation());
\r
55 variable.setVal(body.apply(location, ListElement.INSTANCE.createSpecialization(componentType), listValue, index));
\r
57 if(body.isUnfinished())
\r
58 body.jump(bodyContinuation, body.apply(location, IncreaseByOne.INSTANCE, index));
\r
63 public void check(long location, CodeWriter w, IVal booleanValue) {
\r
64 CodeWriter end = w.createBlock();
\r
65 w.branchAwayUnless(booleanValue, end.getContinuation());
\r
67 if(w.isUnfinished())
\r
68 w.jump(end.getContinuation());
\r