package org.simantics.scl.compiler.internal.codegen.chr; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicReference; import org.cojen.classfile.TypeDesc; import org.objectweb.asm.Label; import org.objectweb.asm.Opcodes; 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; String containerClassName; private TypeDesc containerTypeDesc; private ClassBuilder classBuilder; private TypeDesc storeTypeDesc; private CHRRuleset ruleset; private CHRRule rule; public CHRPriorityFactContainerCodeGenerator(ClassBuilder storeClassBuilder, CHRRuleset ruleset, CHRRule rule) { this.storeClassBuilder = storeClassBuilder; this.containerClassName = storeClassBuilder.getClassName() + "$" + "CHRPriorityFactContainer" + rule.priority; this.containerTypeDesc = TypeDesc.forClass(containerClassName); this.classBuilder = new ClassBuilder(storeClassBuilder.getModuleBuilder(), Opcodes.ACC_PUBLIC, containerClassName, CHRPriorityFactContainer_name); this.storeTypeDesc = storeClassBuilder.getType(); this.ruleset = ruleset; this.rule = rule; } public void generate() { generateFields(); generateContructor(); THashMap> planMap = new THashMap>(); for(CHRSearchPlan plan : rule.plans) { ArrayList list = planMap.get(plan.constraint); if(list == null) { list = new ArrayList(4); planMap.put(plan.constraint, list); } list.add(plan); } planMap.forEachEntry(new TObjectObjectProcedure>() { @Override public boolean execute(CHRConstraint constraint, ArrayList plans) { for(int i=0;i> planMap) { // @Override // public int activate(Object context, int priority) { // return -1; // } MethodBuilderBase mb = classBuilder.addMethodBase(Opcodes.ACC_PUBLIC, "activate", TypeDesc.VOID, new TypeDesc[] {CHRContext, CHRFact}); Label finishLabel = mb.createLabel(); AtomicReference