X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Fchr%2FCHRPriorityFactContainerCodeGenerator.java;h=496a33b36a049e7491111a423d21fad1df6c5025;hp=7ee11f05ec2370e876fa484ae5221319a8ff9b6e;hb=78f577368ba4c71ad6fb3d9f16c03c634585cf7b;hpb=a88529426319d66aa668882d767efb3f58a1a629 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRPriorityFactContainerCodeGenerator.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRPriorityFactContainerCodeGenerator.java index 7ee11f05e..496a33b36 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRPriorityFactContainerCodeGenerator.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRPriorityFactContainerCodeGenerator.java @@ -6,20 +6,18 @@ 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.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; @@ -73,9 +71,9 @@ public class CHRPriorityFactContainerCodeGenerator implements CHRCodeGenerationC } 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)); @@ -102,8 +100,7 @@ public class CHRPriorityFactContainerCodeGenerator implements CHRCodeGenerationC planMap.forEachEntry(new TObjectObjectProcedure>() { @Override public boolean execute(CHRConstraint constraint, ArrayList plans) { - int nextPriority = constraint.nextPriority; - constraint.nextPriority = rule.priority; + int nextPriority = ruleset.getAndUpdateNextPriority(constraint, rule.priority); Label next = nextLabel.get(); if(next != null) @@ -132,6 +129,21 @@ public class CHRPriorityFactContainerCodeGenerator implements CHRCodeGenerationC 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; @@ -148,8 +160,6 @@ public class CHRPriorityFactContainerCodeGenerator implements CHRCodeGenerationC mb.finish(); } - private THashSet usedParameters = new THashSet(); - // protected abstract void activate(CHRContext context, CHRFact fact); private void generateActivate(CHRConstraint constraint, CHRSearchPlan plan, int id) { @@ -159,31 +169,11 @@ public class CHRPriorityFactContainerCodeGenerator implements CHRCodeGenerationC 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 { 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(); } }