]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRPriorityFactContainerCodeGenerator.java
(refs #7250) CHR rules modularization (first working version)
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / chr / CHRPriorityFactContainerCodeGenerator.java
index 7ee11f05ec2370e876fa484ae5221319a8ff9b6e..496a33b36a049e7491111a423d21fad1df6c5025 100644 (file)
@@ -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<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)
@@ -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<BoundVar> usedParameters = new THashSet<BoundVar>();
-
     // 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<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();
     }
 }