-package org.simantics.scl.compiler.elaboration.chr.plan;\r
-\r
-import org.simantics.scl.compiler.compilation.CompilationContext;\r
-import org.simantics.scl.compiler.constants.BooleanConstant;\r
-import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;\r
-import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
-import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
-import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
-import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
-\r
-public class AccessFactOp extends PlanOp {\r
-\r
- Expression inputFact;\r
- CHRConstraint constraint;\r
- Variable[] variables;\r
- boolean killAfterMatch;\r
- \r
- public AccessFactOp(long location, Expression inputFact, CHRConstraint constraint, Variable[] variables,\r
- boolean killAfterMatch) {\r
- super(location);\r
- this.inputFact = inputFact;\r
- this.constraint = constraint;\r
- this.variables = variables;\r
- this.killAfterMatch = killAfterMatch;\r
- }\r
-\r
- @Override\r
- public void toString(StringBuilder b) {\r
- b.append("ACCESS ");\r
- if(killAfterMatch)\r
- b.append("- ");\r
- b.append(constraint);\r
- for(Variable variable : variables)\r
- b.append(' ').append(variable);\r
- b.append(" = ").append(inputFact);\r
- }\r
-\r
- @Override\r
- public void generateCode(CompilationContext context, PlanContext planContext, CodeWriter w) {\r
- IVal inputVal = inputFact.toVal(context.environment, w);\r
- for(int i=0;i<variables.length;++i)\r
- variables[i].setVal(w.apply(location, constraint.accessComponent(i), inputVal));\r
- IVal activeId = w.apply(location, constraint.accessId, inputVal);\r
- CodeWriter end = constraint.mayBeRemoved() ? w.createBlock() : null;\r
- planContext.partnerFacts.add(new PartnerFact(true, activeId, constraint, inputVal, constraint.mayBeRemoved(), killAfterMatch, null, null, end == null ? null : end.getContinuation()));\r
- planContext.nextOp(w);\r
- if(end != null)\r
- end.return_(BooleanConstant.FALSE);\r
- }\r
-\r
-}\r
+package org.simantics.scl.compiler.elaboration.chr.plan;
+
+import org.simantics.scl.compiler.compilation.CompilationContext;
+import org.simantics.scl.compiler.constants.BooleanConstant;
+import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
+import org.simantics.scl.compiler.elaboration.expressions.Expression;
+import org.simantics.scl.compiler.elaboration.expressions.Variable;
+import org.simantics.scl.compiler.internal.codegen.references.IVal;
+import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
+
+public class AccessFactOp extends PlanOp {
+
+ Expression inputFact;
+ CHRConstraint constraint;
+ Variable[] variables;
+ boolean killAfterMatch;
+
+ public AccessFactOp(long location, Expression inputFact, CHRConstraint constraint, Variable[] variables,
+ boolean killAfterMatch) {
+ super(location);
+ this.inputFact = inputFact;
+ this.constraint = constraint;
+ this.variables = variables;
+ this.killAfterMatch = killAfterMatch;
+ }
+
+ @Override
+ public void toString(StringBuilder b) {
+ b.append("ACCESS ");
+ if(killAfterMatch)
+ b.append("- ");
+ b.append(constraint);
+ for(Variable variable : variables)
+ b.append(' ').append(variable);
+ b.append(" = ").append(inputFact);
+ }
+
+ @Override
+ public void generateCode(CompilationContext context, PlanContext planContext, CodeWriter w) {
+ IVal inputVal = inputFact.toVal(context.environment, w);
+ for(int i=0;i<variables.length;++i)
+ variables[i].setVal(constraint.accessComponent(location, w, inputVal, i));
+ IVal activeId = w.apply(location, constraint.accessId, inputVal);
+ CodeWriter end = constraint.mayBeRemoved() ? w.createBlock() : null;
+ planContext.partnerFacts.add(new PartnerFact(true, activeId, constraint, inputVal, constraint.mayBeRemoved(), killAfterMatch, null, null, end == null ? null : end.getContinuation()));
+ planContext.nextOp(w);
+ if(end != null)
+ end.return_(BooleanConstant.FALSE);
+ }
+
+}