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%2FCHRFactCodeGenerator.java;h=865ab22e6c8e18ed31248bfef8bb17e700a083ac;hp=e68ed2baeb1e490b1b4618cf88e8c63930c6e3ab;hb=78f577368ba4c71ad6fb3d9f16c03c634585cf7b;hpb=a88529426319d66aa668882d767efb3f58a1a629 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRFactCodeGenerator.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRFactCodeGenerator.java index e68ed2bae..865ab22e6 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRFactCodeGenerator.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRFactCodeGenerator.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import org.cojen.classfile.TypeDesc; import org.objectweb.asm.Label; import org.objectweb.asm.Opcodes; +import org.simantics.scl.compiler.elaboration.chr.CHRRuleset; import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint; import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint.IndexInfo; import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator; @@ -20,6 +21,7 @@ public class CHRFactCodeGenerator implements CHRCodeGenerationConstants { private JavaTypeTranslator jtt; private ClassBuilder storeClassBuilder; + private CHRRuleset ruleset; private CHRConstraint constraint; private String factClassName; @@ -32,8 +34,9 @@ public class CHRFactCodeGenerator implements CHRCodeGenerationConstants { private TypeDesc[] parameterTypeDescs; private boolean supportsRemoval; - CHRFactCodeGenerator(ClassBuilder storeClassBuilder, CHRConstraint constraint) { + CHRFactCodeGenerator(ClassBuilder storeClassBuilder, CHRRuleset ruleset, CHRConstraint constraint) { this.storeClassBuilder = storeClassBuilder; + this.ruleset = ruleset; this.constraint = constraint; this.moduleBuilder = storeClassBuilder.getModuleBuilder(); @@ -123,7 +126,7 @@ public class CHRFactCodeGenerator implements CHRCodeGenerationConstants { continue; constructorParameters.add(typeDesc); } - MethodBuilderBase mb = classBuilder.addConstructor(Opcodes.ACC_PUBLIC, constructorParameters.toArray(new TypeDesc[constructorParameters.size()])); + MethodBuilderBase mb = classBuilder.addConstructorBase(Opcodes.ACC_PUBLIC, constructorParameters.toArray(new TypeDesc[constructorParameters.size()])); mb.loadThis(); mb.invokeConstructor(classBuilder.getSuperClassName(), Constants.EMPTY_TYPEDESC_ARRAY); mb.loadThis(); @@ -205,13 +208,30 @@ public class CHRFactCodeGenerator implements CHRCodeGenerationConstants { } // Add fact to priority queue - if(constraint.minimumPriority != Integer.MAX_VALUE) { + int minimumPriority = ruleset.getMinimumPriority(constraint); + if(minimumPriority != Integer.MAX_VALUE) { mb.loadLocal(storeParameter); - mb.loadField(storeClassBuilder.getClassName(), CHRCodeGenerationConstants.priorityName(constraint.minimumPriority), CHRPriorityFactContainer); + mb.loadField(storeClassBuilder.getClassName(), CHRCodeGenerationConstants.priorityName(minimumPriority), CHRPriorityFactContainer); mb.loadLocal(mb.getParameter(1)); mb.loadThis(); mb.invokeVirtual(CHRPriorityFactContainer_name, "addFact", TypeDesc.VOID, new TypeDesc[] {CHRContext, CHRFact}); } + else if(constraint.nextContainerFieldName != null) { + mb.loadLocal(storeParameter); + mb.loadField(storeClassBuilder.getClassName(), constraint.nextContainerFieldName, CHRPriorityFactContainer); + LocalVariable containerVar = mb.createLocalVariable("container", CHRPriorityFactContainer); + mb.storeLocal(containerVar); + + mb.loadLocal(containerVar); + Label finishLabel = mb.createLabel(); + mb.ifNullBranch(finishLabel, true); + + mb.loadLocal(containerVar); + mb.loadLocal(mb.getParameter(1)); + mb.loadThis(); + mb.invokeVirtual(CHRPriorityFactContainer_name, "addFact", TypeDesc.VOID, new TypeDesc[] {CHRContext, CHRFact}); + mb.setLocation(finishLabel); + } mb.returnVoid(); mb.finish(); }