import org.simantics.scl.compiler.internal.codegen.continuations.ICont;
import org.simantics.scl.compiler.internal.codegen.references.IVal;
import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.types.Types;
public class IterateConstraintOp extends PlanOp {
IVal fact = body.getParameters()[0];
ArrayList<IVal> parameters = new ArrayList<IVal>(expressions.length+1);
- parameters.add(planContext.storeVar);
+ parameters.add(planContext.getStoreVar(constraint));
for(int i=0;i<expressions.length;++i)
if(((boundMask>>i)&1)==1)
- parameters.add(expressions[i].toVal(context.environment, w));
- w.jump(bodyContinuation, w.apply(location,
+ parameters.add(expressions[i].toVal(context, w));
+ w.jump(location, bodyContinuation, w.apply(location,
constraint.fetchFromIndex(context, boundMask), parameters.toArray(new IVal[parameters.size()])));
- body.branchAwayIf(body.apply(location, NullCheck.INSTANCE.createSpecialization(constraint.factType), fact),
+ body.branchAwayIf(location, body.apply(location, NullCheck.INSTANCE.createSpecialization(constraint.factType), fact),
end.getContinuation());
IVal id = body.apply(location, constraint.accessId, fact);
for(PartnerFact partnerFact : planContext.partnerFacts)
if(partnerFact.active && !passive) {
- body.branchAwayUnless(body.apply(location, JavaComparisonOperation.ILESS, id, partnerFact.id),
+ body.branchAwayUnless(location, body.apply(location, JavaComparisonOperation.ILESS, id, partnerFact.id),
nextFact.getContinuation());
}
else if(partnerFact.constraint == constraint) {
- body.branchAwayIf(body.apply(location, JavaComparisonOperation.IEQUAL, id, partnerFact.id),
+ body.branchAwayIf(location, body.apply(location, JavaComparisonOperation.IEQUAL, id, partnerFact.id),
nextFact.getContinuation());
}
for(int i=0;i<variables.length;++i)
if(((boundMask>>i)&1)==0)
- variables[i].setVal(body.apply(location, constraint.accessComponent(i), fact));
+ variables[i].setVal(constraint.accessComponent(location, body, fact, i));
Constant nextElement = constraint.nextElement(context, boundMask);
planContext.partnerFacts.add(new PartnerFact(false, id, constraint, fact, constraint.mayBeRemoved(), killAfterMatch, nextElement, bodyContinuation, end.getContinuation()));
planContext.nextOp(body);
if(body.isUnfinished())
- body.jump(nextFact.getContinuation());
- nextFact.jump(bodyContinuation, nextFact.apply(location, nextElement, fact));
+ body.jump(location, nextFact.getContinuation());
+ nextFact.jump(location, bodyContinuation, nextFact.apply(location, nextElement, fact));
w.continueAs(end);
}