]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/SSAStatement.java
Merge "Re-enabled Acorn transaction cancellation support for testing"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / ssa / SSAStatement.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.internal.codegen.references.BoundVar;\r
6 import org.simantics.scl.compiler.internal.codegen.references.Val;\r
7 import org.simantics.scl.compiler.internal.codegen.references.ValRef;\r
8 import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;\r
9 import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;\r
10 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;\r
11 import org.simantics.scl.compiler.internal.codegen.utils.Printable;\r
12 import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext;\r
13 import org.simantics.scl.compiler.internal.codegen.utils.SSALambdaLiftingContext;\r
14 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;\r
15 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;\r
16 import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor;\r
17 import org.simantics.scl.compiler.types.TVar;\r
18 import org.simantics.scl.compiler.types.Type;\r
19 import org.simantics.scl.compiler.types.Types;\r
20 \r
21 \r
22 public abstract class SSAStatement implements Printable {\r
23     SSABlock parent;\r
24     SSAStatement prev;\r
25     SSAStatement next;\r
26     public long location;\r
27     \r
28     public void detach() {\r
29         if(prev == null)\r
30             parent.firstStatement = next;\r
31         else\r
32             prev.next = next;\r
33         if(next == null)\r
34             parent.lastStatement = prev;\r
35         else\r
36             next.prev = prev;\r
37     }\r
38 \r
39     public abstract void generateCode(MethodBuilder mb);\r
40 \r
41     public abstract void validate(SSAValidationContext context);\r
42 \r
43     public void simplify(SSASimplificationContext context) {\r
44     }\r
45 \r
46     public abstract void destroy();\r
47     \r
48     public SSABlock getParent() {\r
49         return parent;\r
50     }\r
51     \r
52     public SSAStatement getPrev() {\r
53         return prev;\r
54     }\r
55     \r
56     public void setAsLastStatement() {\r
57         this.next = null;\r
58         parent.lastStatement = this;\r
59     }\r
60     \r
61     public SSAStatement getNext() {\r
62         return next;\r
63     }\r
64     \r
65     public void remove() {\r
66         detach();\r
67         destroy();        \r
68     }\r
69     \r
70     @Override\r
71     public String toString() {\r
72         PrintingContext context = new PrintingContext();\r
73         toString(context);\r
74         return context.toString();\r
75     }\r
76 \r
77     public void markGenerateOnFly() {        \r
78     }\r
79 \r
80     public abstract SSAStatement copy(CopyContext context);\r
81     public abstract void replace(TVar[] vars, Type[] replacements);\r
82 \r
83     public abstract void addBoundVariablesTo(SSAValidationContext context);\r
84 \r
85     public abstract void collectFreeVariables(SSAFunction function, ArrayList<ValRef> vars);\r
86     \r
87     public SSAFunction getParentFunction() {\r
88         return parent.parent;\r
89     }\r
90 \r
91     public void lambdaLift(SSALambdaLiftingContext context) {\r
92     }\r
93     \r
94     public void insertBefore(SSAStatement statement) {\r
95         next = statement;\r
96         prev = statement.prev;\r
97         parent = statement.parent;\r
98         if(prev == null)\r
99             parent.firstStatement = this;\r
100         else\r
101             prev.next = this;\r
102         statement.prev = this;        \r
103     }\r
104     \r
105     public void insertAfter(SSAStatement statement) {\r
106         prev = statement;\r
107         next = statement.next;\r
108         parent = statement.parent;\r
109         if(next == null)\r
110             parent.lastStatement = this;\r
111         else\r
112             next.prev = this;\r
113         statement.next = this;        \r
114     }\r
115     \r
116     public void replaceByApply(ValRef valRef, Val function, Type[] typeParameters, Val[] parameters) {\r
117         BoundVar target = new BoundVar(valRef.getBinding().getType());\r
118         new LetApply(target, Types.NO_EFFECTS, function.createOccurrence(typeParameters), ValRef.createOccurrences(parameters)).insertBefore(this);\r
119         valRef.replaceBy(target);\r
120     }\r
121 \r
122     public void prepare(MethodBuilder mb) {        \r
123     }\r
124 \r
125     public abstract void forValRefs(ValRefVisitor visitor);\r
126 }\r