]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/SSAClosure.java
57748b284b436c727109433613296de9e6910148
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / ssa / SSAClosure.java
1 package org.simantics.scl.compiler.internal.codegen.ssa;
2
3 import java.util.ArrayList;
4
5 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
6 import org.simantics.scl.compiler.constants.Constant;
7 import org.simantics.scl.compiler.internal.codegen.references.BoundVar;
8 import org.simantics.scl.compiler.internal.codegen.references.Val;
9 import org.simantics.scl.compiler.internal.codegen.references.ValRef;
10 import org.simantics.scl.compiler.internal.codegen.ssa.binders.BoundVarBinder;
11 import org.simantics.scl.compiler.internal.codegen.ssa.binders.ClosureBinder;
12 import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;
13 import org.simantics.scl.compiler.internal.codegen.utils.ModuleBuilder;
14 import org.simantics.scl.compiler.internal.codegen.utils.Printable;
15 import org.simantics.scl.compiler.internal.codegen.utils.SSALambdaLiftingContext;
16 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
17 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;
18 import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor;
19 import org.simantics.scl.compiler.types.TVar;
20 import org.simantics.scl.compiler.types.Type;
21
22 public abstract class SSAClosure implements Printable, BoundVarBinder {
23     Val target;
24     
25     ClosureBinder parent;
26     SSAClosure prev;
27     SSAClosure next;
28     
29     public void setParent(ClosureBinder parent) {
30         this.parent = parent;
31     }
32
33     public SSAClosure getNext() {
34         return next;
35     }
36
37     public void setPrev(SSAClosure function) {
38         this.prev = function;
39     }
40
41     public void setNext(SSAClosure function) {
42         this.next = function;
43     }
44
45     public SSAFunction getParentFunction() {
46         return parent.getParentFunction();
47     }
48     
49     public ClosureBinder getParent() {
50         return parent;
51     }
52
53     public Val getTarget() {
54         return target;
55     }
56     
57     public void setTarget(Val target) {
58         this.target = target;
59         if(target instanceof BoundVar)
60             ((BoundVar) target).parent = this;             
61     }
62     
63     public void setTarget(BoundVar target) {
64         this.target = target;
65         target.parent = this;             
66     }
67     
68     public void detach() {
69         if(prev == null)
70             parent.setFirstClosure(next);
71         else
72             prev.next = next;
73         if(next != null)
74             next.prev = prev;
75     }
76     
77     public void remove() {
78         destroy();
79         detach();
80     }
81
82     public SSAClosure copy() {
83         return copy(new CopyContext());
84     }
85     
86     public abstract void destroy();
87     public abstract SSAClosure copy(CopyContext context);
88     public abstract void markGenerateOnFly();
89     public abstract void replace(TVar[] vars, Type[] replacements);
90     public abstract void collectFreeVariables(ArrayList<ValRef> freeVars);
91     public abstract void simplify(SSASimplificationContext context);
92     public abstract void validate(SSAValidationContext context);
93     public abstract void lambdaLift(SSALambdaLiftingContext context);
94     public abstract boolean isValue();
95     public abstract Type getType();
96     public abstract void parametrize(BoundVar[] parameters);
97
98     public Constant liftClosure(BoundVar newTarget, BoundVar[] newVarsList) {
99         throw new InternalCompilerError("Unsupported method liftClosure");
100     }
101
102     public void generateCode(ModuleBuilder moduleBuilder) {
103         throw new InternalCompilerError("Unsupported method generateCode");
104     }
105
106     public abstract void forValRefs(ValRefVisitor visitor);
107     
108 }