]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/SSAClosure.java
Merge "List the unsatisfied dependencies in CanvasContext"
[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;\r
2 \r
3 import java.util.ArrayList;\r
4 \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
21 \r
22 public abstract class SSAClosure implements Printable, BoundVarBinder{    \r
23     Val target;\r
24     \r
25     ClosureBinder parent;\r
26     SSAClosure prev;\r
27     SSAClosure next;\r
28     \r
29     public void setParent(ClosureBinder parent) {\r
30         this.parent = parent;\r
31     }\r
32 \r
33     public SSAClosure getNext() {\r
34         return next;\r
35     }\r
36 \r
37     public void setPrev(SSAClosure function) {\r
38         this.prev = function;\r
39     }\r
40 \r
41     public void setNext(SSAClosure function) {\r
42         this.next = function;\r
43     }\r
44 \r
45     public SSAFunction getParentFunction() {\r
46         return parent.getParentFunction();\r
47     }\r
48     \r
49     public ClosureBinder getParent() {\r
50         return parent;\r
51     }\r
52 \r
53     public Val getTarget() {\r
54         return target;\r
55     }\r
56     \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
61     }\r
62     \r
63     public void setTarget(BoundVar target) {\r
64         this.target = target;\r
65         target.parent = this;             \r
66     }\r
67     \r
68     public void detach() {\r
69         if(prev == null)\r
70             parent.setFirstClosure(next);\r
71         else\r
72             prev.next = next;\r
73         if(next != null)\r
74             next.prev = prev;\r
75     }\r
76     \r
77     public void remove() {\r
78         destroy();\r
79         detach();\r
80     }\r
81 \r
82     public SSAClosure copy() {\r
83         return copy(new CopyContext());\r
84     }\r
85     \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
97 \r
98     public Constant liftClosure(BoundVar newTarget, BoundVar[] newVarsList) {\r
99         throw new InternalCompilerError("Unsupported method liftClosure");\r
100     }\r
101 \r
102     public void generateCode(ModuleBuilder moduleBuilder) {\r
103         throw new InternalCompilerError("Unsupported method generateCode");\r
104     }\r
105 \r
106     public abstract void forValRefs(ValRefVisitor visitor);\r
107     \r
108 }\r