]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/SSAClosure.java
Merged changes from feature/scl to master.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / ssa / SSAClosure.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/SSAClosure.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/SSAClosure.java
new file mode 100644 (file)
index 0000000..6559788
--- /dev/null
@@ -0,0 +1,108 @@
+package org.simantics.scl.compiler.internal.codegen.ssa;\r
+\r
+import java.util.ArrayList;\r
+\r
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
+import org.simantics.scl.compiler.constants.Constant;\r
+import org.simantics.scl.compiler.internal.codegen.references.BoundVar;\r
+import org.simantics.scl.compiler.internal.codegen.references.Val;\r
+import org.simantics.scl.compiler.internal.codegen.references.ValRef;\r
+import org.simantics.scl.compiler.internal.codegen.ssa.binders.BoundVarBinder;\r
+import org.simantics.scl.compiler.internal.codegen.ssa.binders.ClosureBinder;\r
+import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;\r
+import org.simantics.scl.compiler.internal.codegen.utils.ModuleBuilder;\r
+import org.simantics.scl.compiler.internal.codegen.utils.Printable;\r
+import org.simantics.scl.compiler.internal.codegen.utils.SSALambdaLiftingContext;\r
+import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;\r
+import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;\r
+import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor;\r
+import org.simantics.scl.compiler.types.TVar;\r
+import org.simantics.scl.compiler.types.Type;\r
+\r
+public abstract class SSAClosure implements Printable, BoundVarBinder{    \r
+    Val target;\r
+    \r
+    ClosureBinder parent;\r
+    SSAClosure prev;\r
+    SSAClosure next;\r
+    \r
+    public void setParent(ClosureBinder parent) {\r
+        this.parent = parent;\r
+    }\r
+\r
+    public SSAClosure getNext() {\r
+        return next;\r
+    }\r
+\r
+    public void setPrev(SSAClosure function) {\r
+        this.prev = function;\r
+    }\r
+\r
+    public void setNext(SSAClosure function) {\r
+        this.next = function;\r
+    }\r
+\r
+    public SSAFunction getParentFunction() {\r
+        return parent.getParentFunction();\r
+    }\r
+    \r
+    public ClosureBinder getParent() {\r
+        return parent;\r
+    }\r
+\r
+    public Val getTarget() {\r
+        return target;\r
+    }\r
+    \r
+    public void setTarget(Val target) {\r
+        this.target = target;\r
+        if(target instanceof BoundVar)\r
+            ((BoundVar) target).parent = this;             \r
+    }\r
+    \r
+    public void setTarget(BoundVar target) {\r
+        this.target = target;\r
+        target.parent = this;             \r
+    }\r
+    \r
+    public void detach() {\r
+        if(prev == null)\r
+            parent.setFirstClosure(next);\r
+        else\r
+            prev.next = next;\r
+        if(next != null)\r
+            next.prev = prev;\r
+    }\r
+    \r
+    public void remove() {\r
+        destroy();\r
+        detach();\r
+    }\r
+\r
+    public SSAClosure copy() {\r
+        return copy(new CopyContext());\r
+    }\r
+    \r
+    public abstract void destroy();\r
+    public abstract SSAClosure copy(CopyContext context);\r
+    public abstract void markGenerateOnFly();\r
+    public abstract void replace(TVar[] vars, Type[] replacements);\r
+    public abstract void collectFreeVariables(ArrayList<ValRef> freeVars);\r
+    public abstract void simplify(SSASimplificationContext context);\r
+    public abstract void validate(SSAValidationContext context);\r
+    public abstract void lambdaLift(SSALambdaLiftingContext context);\r
+    public abstract boolean isValue();\r
+    public abstract Type getType();\r
+    public abstract void parametrize(BoundVar[] parameters);\r
+\r
+    public Constant liftClosure(BoundVar newTarget, BoundVar[] newVarsList) {\r
+        throw new InternalCompilerError("Unsupported method liftClosure");\r
+    }\r
+\r
+    public void generateCode(ModuleBuilder moduleBuilder) {\r
+        throw new InternalCompilerError("Unsupported method generateCode");\r
+    }\r
+\r
+    public abstract void forValRefs(ValRefVisitor visitor);\r
+    \r
+}\r