]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/PlanContext.java
Merged changes from feature/scl to master.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / plan / PlanContext.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/PlanContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/PlanContext.java
new file mode 100644 (file)
index 0000000..48ecc7b
--- /dev/null
@@ -0,0 +1,71 @@
+package org.simantics.scl.compiler.elaboration.chr.plan;\r
+\r
+import java.util.ArrayList;\r
+\r
+import org.simantics.scl.compiler.compilation.CompilationContext;\r
+import org.simantics.scl.compiler.constants.IntegerConstant;\r
+import org.simantics.scl.compiler.constants.JavaComparisonOperation;\r
+import org.simantics.scl.compiler.constants.singletons.IncreaseByOne;\r
+import org.simantics.scl.compiler.constants.singletons.ListElement;\r
+import org.simantics.scl.compiler.constants.singletons.ListLength;\r
+import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;\r
+import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
+import org.simantics.scl.compiler.internal.codegen.continuations.ICont;\r
+import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
+import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
+import org.simantics.scl.compiler.types.Type;\r
+import org.simantics.scl.compiler.types.Types;\r
+\r
+public abstract class PlanContext {\r
+    public CompilationContext context;\r
+    public CHRRuleset ruleset;\r
+    public IVal storeVar;\r
+    public ArrayList<PartnerFact> partnerFacts = new ArrayList<PartnerFact>();\r
+    public IVal currentId;\r
+    \r
+    public PlanContext(CompilationContext context, CHRRuleset ruleset, IVal storeVar) {\r
+        this.context = context;\r
+        this.ruleset = ruleset;\r
+        this.storeVar = storeVar;\r
+    }\r
+\r
+    public abstract void nextOp(CodeWriter w);\r
+\r
+    public IVal generateNewId(long location, CodeWriter w) {\r
+        if(currentId == null)\r
+            currentId = w.apply(location, ruleset.readCurrentId, storeVar);\r
+        IVal result = currentId;\r
+        currentId = w.apply(location, IncreaseByOne.INSTANCE, currentId);\r
+        return result;\r
+    }\r
+    \r
+    public void iterateList(long location, CodeWriter w, Variable variable, IVal listValue) {\r
+        Type componentType = variable.getType();\r
+        IVal listLength = w.apply(location, ListLength.INSTANCE.createSpecialization(componentType), listValue);\r
+        \r
+        CodeWriter body = w.createBlock(Types.INTEGER);\r
+        ICont bodyContinuation = body.getContinuation();\r
+        CodeWriter end = w.createBlock();\r
+                \r
+        w.jump(body.getContinuation(), IntegerConstant.ZERO);\r
+        \r
+        IVal index = body.getParameters()[0];\r
+        body.branchAwayIf(body.apply(location, JavaComparisonOperation.IEQUAL, index, listLength),\r
+                end.getContinuation());\r
+        variable.setVal(body.apply(location, ListElement.INSTANCE.createSpecialization(componentType), listValue, index));\r
+        nextOp(body);\r
+        if(body.isUnfinished())\r
+            body.jump(bodyContinuation, body.apply(location, IncreaseByOne.INSTANCE, index));\r
+        \r
+        w.continueAs(end);\r
+    }\r
+\r
+    public void check(long location, CodeWriter w, IVal booleanValue) {\r
+        CodeWriter end = w.createBlock();\r
+        w.branchAwayUnless(booleanValue, end.getContinuation());\r
+        nextOp(w);\r
+        if(w.isUnfinished())\r
+            w.jump(end.getContinuation());\r
+        w.continueAs(end);\r
+    }\r
+}\r