1 package org.simantics.scl.compiler.internal.codegen.ssa;
\r
3 import java.util.ArrayList;
\r
5 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;
\r
6 import org.simantics.scl.compiler.internal.codegen.continuations.ContRef;
\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.statements.LetApply;
\r
11 import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;
\r
12 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
\r
13 import org.simantics.scl.compiler.internal.codegen.utils.Printable;
\r
14 import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext;
\r
15 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
\r
16 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;
\r
17 import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor;
\r
18 import org.simantics.scl.compiler.types.TVar;
\r
19 import org.simantics.scl.compiler.types.Type;
\r
20 import org.simantics.scl.compiler.types.Types;
\r
23 public abstract class SSAExit implements Printable {
\r
25 public long location;
\r
27 public abstract void generateCode(MethodBuilder mb);
\r
29 public abstract void validate(SSAValidationContext context);
\r
31 public void simplify(SSASimplificationContext context) {
\r
34 public abstract void destroy();
\r
37 public String toString() {
\r
38 PrintingContext context = new PrintingContext();
\r
40 return context.toString();
\r
43 public SSABlock getParent() {
\r
47 public abstract SSAExit copy(CopyContext context);
\r
48 public abstract void replace(TVar[] vars, Type[] replacements);
\r
50 public abstract void collectFreeVariables(SSAFunction function, ArrayList<ValRef> vars);
\r
52 public abstract Cont addParametersInFrontOf(ContRef contRef, Val[] newParameters, Val[] oldParameters, Cont proxy);
\r
54 public SSAFunction getParentFunction() {
\r
55 return parent.parent;
\r
58 public void replaceByApply(ValRef valRef, Val function, Type[] typeParameters, Val[] parameters) {
\r
59 BoundVar target = new BoundVar(valRef.getBinding().getType());
\r
60 parent.addStatement(new LetApply(target, Types.NO_EFFECTS, function.createOccurrence(typeParameters), ValRef.createOccurrences(parameters)));
\r
61 valRef.replaceBy(target);
\r
64 public boolean isJump(Cont cont, Val parameter) {
\r
68 public abstract SSABlock[] getSuccessors();
\r
70 public void prepare(MethodBuilder mb) {
\r
73 public abstract void forValRefs(ValRefVisitor visitor);
\r