]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/SSAExit.java
(refs #7250) Merging master, minor CHR bugfixes
[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 long location;
26
27     public abstract void generateCode(MethodBuilder mb);
28
29     public abstract void validate(SSAValidationContext context);
30
31     public void simplify(SSASimplificationContext context) {
32     }
33
34     public abstract void destroy();
35     
36     @Override
37     public String toString() {
38         PrintingContext context = new PrintingContext();
39         toString(context);
40         return context.toString();
41     }
42     
43     public SSABlock getParent() {
44         return parent;
45     }
46
47     public abstract SSAExit copy(CopyContext context);
48     public abstract void replace(TVar[] vars, Type[] replacements);
49
50     public abstract void collectFreeVariables(SSAFunction function, ArrayList<ValRef> vars);
51
52     public abstract Cont addParametersInFrontOf(ContRef contRef, Val[] newParameters, Val[] oldParameters, Cont proxy);
53     
54     public SSAFunction getParentFunction() {
55         return parent.parent;
56     }
57     
58     public void replaceByApply(ValRef valRef, Val function, Type[] typeParameters, Val[] parameters) {
59         BoundVar target = new BoundVar(valRef.getBinding().getType());
60         parent.addStatement(new LetApply(target, Types.NO_EFFECTS, function.createOccurrence(typeParameters), ValRef.createOccurrences(parameters)));
61         valRef.replaceBy(target);
62     }
63
64     public boolean isJump(Cont cont, Val parameter) {        
65         return false;
66     }
67     
68     public abstract SSABlock[] getSuccessors();
69
70     public void prepare(MethodBuilder mb) {
71     }
72
73     public abstract void forValRefs(ValRefVisitor visitor);
74 }