import org.cojen.classfile.TypeDesc;
import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
import org.simantics.scl.compiler.elaboration.chr.CHRRule;
import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
import org.simantics.scl.compiler.elaboration.chr.plan.CHRSearchPlan;
import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
-import org.simantics.scl.compiler.internal.codegen.references.BoundVar;
import org.simantics.scl.compiler.internal.codegen.utils.ClassBuilder;
import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable;
import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilderBase;
-import gnu.trove.impl.PrimeFinder;
import gnu.trove.map.hash.THashMap;
import gnu.trove.procedure.TObjectObjectProcedure;
-import gnu.trove.set.hash.THashSet;
public class CHRPriorityFactContainerCodeGenerator implements CHRCodeGenerationConstants {
ClassBuilder storeClassBuilder;
}
private void generateContructor() {
- MethodBuilderBase mb = classBuilder.addConstructor(Opcodes.ACC_PUBLIC, new TypeDesc[] {storeTypeDesc});
+ MethodBuilderBase mb = classBuilder.addConstructorBase(Opcodes.ACC_PUBLIC, new TypeDesc[] {storeTypeDesc});
mb.loadThis();
- mb.loadConstant(rule.priority);
+ mb.loadConstant(rule.priority + ruleset.initialPriorityNumber);
mb.invokeSuperConstructor(new TypeDesc[] {TypeDesc.INT});
mb.loadThis();
mb.loadLocal(mb.getParameter(0));
planMap.forEachEntry(new TObjectObjectProcedure<CHRConstraint, ArrayList<CHRSearchPlan>>() {
@Override
public boolean execute(CHRConstraint constraint, ArrayList<CHRSearchPlan> plans) {
- int nextPriority = constraint.nextPriority;
- constraint.nextPriority = rule.priority;
+ int nextPriority = ruleset.getAndUpdateNextPriority(constraint, rule.priority);
Label next = nextLabel.get();
if(next != null)
mb.loadLocal(mb.getParameter(1));
mb.invokeVirtual(CHRPriorityFactContainer_name, "addFact", TypeDesc.VOID, new TypeDesc[] {CHRContext, CHRFact});
}
+ else if(constraint.nextContainerFieldName != null && !ruleset.constraintSourceMap.containsKey(constraint)) {
+ mb.loadThis();
+ mb.loadField(containerClassName, "parent", storeTypeDesc);
+ mb.loadField(storeClassBuilder.getClassName(), constraint.nextContainerFieldName, CHRPriorityFactContainer);
+ LocalVariable containerVar = mb.createLocalVariable("container", CHRPriorityFactContainer);
+ mb.storeLocal(containerVar);
+
+ mb.loadLocal(containerVar);
+ mb.ifNullBranch(finishLabel, true);
+
+ mb.loadLocal(containerVar);
+ mb.loadLocal(mb.getParameter(0));
+ mb.loadLocal(mb.getParameter(1));
+ mb.invokeVirtual(CHRPriorityFactContainer_name, "addFact", TypeDesc.VOID, new TypeDesc[] {CHRContext, CHRFact});
+ }
mb.branch(finishLabel);
return true;
mb.finish();
}
- private THashSet<BoundVar> usedParameters = new THashSet<BoundVar>();
-
// protected abstract void activate(CHRContext context, CHRFact fact);
private void generateActivate(CHRConstraint constraint, CHRSearchPlan plan, int id) {
mb.loadField(containerClassName, "parent", storeTypeDesc);
LocalVariable parent = mb.createLocalVariable("parent", storeTypeDesc);
mb.storeLocal(parent);
- BoundVar[] implementationParameters = plan.implementation.getParameters();
- mb.setLocalVariable(ruleset.this_, parent);
- mb.setLocalVariable(implementationParameters[0], mb.getParameter(0));
- mb.setLocalVariable(implementationParameters[1], mb.getParameter(1));
-
- // Set closure parameters
- usedParameters.clear();
- plan.implementation.forValRefs(valRef -> {
- if(valRef.getBinding() instanceof BoundVar)
- usedParameters.add((BoundVar)valRef.getBinding());
- });
- for(int j=0;j<ruleset.parameters.length;++j) {
- BoundVar parameter = ruleset.parameters[j];
- if(!usedParameters.contains(parameter))
- continue;
+ ruleset.rulesetObject.realizeMethod(mb, (i, target) -> {
mb.loadLocal(parent);
- mb.loadField(storeClassBuilder.getClassName(), CHRCodeGenerationConstants.parameterName(j), ruleset.parameterTypeDescs[j]);
- mb.store(parameter);
- }
-
- // Generate code
- //System.out.println("=== activate" + i + " ==========================================================");
- //System.out.println(plan.implementation);
- plan.implementation.markGenerateOnFly();
- plan.implementation.generateCodeWithAlreadyPreparedParameters(mb);
+ mb.loadField(storeClassBuilder.getClassName(), CHRCodeGenerationConstants.parameterName(i), ruleset.rulesetObject.parameterTypeDescs[i]);
+ mb.store(target);
+ }, plan.implementation, parent, mb.getParameter(0), mb.getParameter(1));
mb.finish();
}
}