1 package org.simantics.scl.compiler.internal.codegen.ssa;
\r
3 import java.util.ArrayList;
\r
5 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
\r
6 import org.simantics.scl.compiler.constants.Constant;
\r
7 import org.simantics.scl.compiler.internal.codegen.references.BoundVar;
\r
8 import org.simantics.scl.compiler.internal.codegen.references.Val;
\r
9 import org.simantics.scl.compiler.internal.codegen.references.ValRef;
\r
10 import org.simantics.scl.compiler.internal.codegen.ssa.binders.BoundVarBinder;
\r
11 import org.simantics.scl.compiler.internal.codegen.ssa.binders.ClosureBinder;
\r
12 import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;
\r
13 import org.simantics.scl.compiler.internal.codegen.utils.ModuleBuilder;
\r
14 import org.simantics.scl.compiler.internal.codegen.utils.Printable;
\r
15 import org.simantics.scl.compiler.internal.codegen.utils.SSALambdaLiftingContext;
\r
16 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
\r
17 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;
\r
18 import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor;
\r
19 import org.simantics.scl.compiler.types.TVar;
\r
20 import org.simantics.scl.compiler.types.Type;
\r
22 public abstract class SSAClosure implements Printable, BoundVarBinder{
\r
25 ClosureBinder parent;
\r
29 public void setParent(ClosureBinder parent) {
\r
30 this.parent = parent;
\r
33 public SSAClosure getNext() {
\r
37 public void setPrev(SSAClosure function) {
\r
38 this.prev = function;
\r
41 public void setNext(SSAClosure function) {
\r
42 this.next = function;
\r
45 public SSAFunction getParentFunction() {
\r
46 return parent.getParentFunction();
\r
49 public ClosureBinder getParent() {
\r
53 public Val getTarget() {
\r
57 public void setTarget(Val target) {
\r
58 this.target = target;
\r
59 if(target instanceof BoundVar)
\r
60 ((BoundVar) target).parent = this;
\r
63 public void setTarget(BoundVar target) {
\r
64 this.target = target;
\r
65 target.parent = this;
\r
68 public void detach() {
\r
70 parent.setFirstClosure(next);
\r
77 public void remove() {
\r
82 public SSAClosure copy() {
\r
83 return copy(new CopyContext());
\r
86 public abstract void destroy();
\r
87 public abstract SSAClosure copy(CopyContext context);
\r
88 public abstract void markGenerateOnFly();
\r
89 public abstract void replace(TVar[] vars, Type[] replacements);
\r
90 public abstract void collectFreeVariables(ArrayList<ValRef> freeVars);
\r
91 public abstract void simplify(SSASimplificationContext context);
\r
92 public abstract void validate(SSAValidationContext context);
\r
93 public abstract void lambdaLift(SSALambdaLiftingContext context);
\r
94 public abstract boolean isValue();
\r
95 public abstract Type getType();
\r
96 public abstract void parametrize(BoundVar[] parameters);
\r
98 public Constant liftClosure(BoundVar newTarget, BoundVar[] newVarsList) {
\r
99 throw new InternalCompilerError("Unsupported method liftClosure");
\r
102 public void generateCode(ModuleBuilder moduleBuilder) {
\r
103 throw new InternalCompilerError("Unsupported method generateCode");
\r
106 public abstract void forValRefs(ValRefVisitor visitor);
\r