]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/SSAExit.java
SCL compiler generates line numbers to bytecode
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / ssa / SSAExit.java
1 package org.simantics.scl.compiler.internal.codegen.ssa;
2
3 import java.util.ArrayList;
4
5 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;
6 import org.simantics.scl.compiler.internal.codegen.continuations.ContRef;
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.statements.LetApply;
11 import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;
12 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
13 import org.simantics.scl.compiler.internal.codegen.utils.Printable;
14 import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext;
15 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
16 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;
17 import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor;
18 import org.simantics.scl.compiler.types.TVar;
19 import org.simantics.scl.compiler.types.Type;
20 import org.simantics.scl.compiler.types.Types;
21
22
23 public abstract class SSAExit implements Printable {
24     SSABlock parent;
25     public final int lineNumber;
26     
27     public SSAExit(int lineNumber) {
28         this.lineNumber = lineNumber;
29     }
30
31     public abstract void generateCode(MethodBuilder mb);
32
33     public abstract void validate(SSAValidationContext context);
34
35     public void simplify(SSASimplificationContext context) {
36     }
37
38     public abstract void destroy();
39     
40     @Override
41     public String toString() {
42         PrintingContext context = new PrintingContext();
43         toString(context);
44         return context.toString();
45     }
46     
47     public SSABlock getParent() {
48         return parent;
49     }
50
51     public abstract SSAExit copy(CopyContext context);
52     public abstract void replace(TVar[] vars, Type[] replacements);
53
54     public abstract void collectFreeVariables(SSAFunction function, ArrayList<ValRef> vars);
55
56     public abstract Cont addParametersInFrontOf(ContRef contRef, Val[] newParameters, Val[] oldParameters, Cont proxy);
57     
58     public SSAFunction getParentFunction() {
59         return parent.parent;
60     }
61     
62     public void replaceByApply(ValRef valRef, Val function, Type[] typeParameters, Val[] parameters) {
63         BoundVar target = new BoundVar(valRef.getBinding().getType());
64         parent.addStatement(new LetApply(target, Types.NO_EFFECTS, function.createOccurrence(typeParameters), ValRef.createOccurrences(parameters)));
65         valRef.replaceBy(target);
66     }
67
68     public boolean isJump(Cont cont, Val parameter) {        
69         return false;
70     }
71     
72     public abstract SSABlock[] getSuccessors();
73
74     public void prepare(MethodBuilder mb) {
75     }
76
77     public abstract void forValRefs(ValRefVisitor visitor);
78
79     public abstract void cleanup();
80 }