--- /dev/null
+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