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.types.TVar;
\r
18 import org.simantics.scl.compiler.types.Type;
\r
19 import org.simantics.scl.compiler.types.Types;
\r
22 public abstract class SSAExit implements Printable {
\r
24 public long location;
\r
26 public abstract void generateCode(MethodBuilder mb);
\r
28 public abstract void validate(SSAValidationContext context);
\r
30 public void simplify(SSASimplificationContext context) {
\r
33 public abstract void destroy();
\r
36 public String toString() {
\r
37 PrintingContext context = new PrintingContext();
\r
39 return context.toString();
\r
42 public SSABlock getParent() {
\r
46 public abstract SSAExit copy(CopyContext context);
\r
47 public abstract void replace(TVar[] vars, Type[] replacements);
\r
49 public abstract void collectFreeVariables(SSAFunction function, ArrayList<ValRef> vars);
\r
51 public abstract Cont addParametersInFrontOf(ContRef contRef, Val[] newParameters, Val[] oldParameters, Cont proxy);
\r
53 public SSAFunction getParentFunction() {
\r
54 return parent.parent;
\r
57 public void replaceByApply(ValRef valRef, Val function, Type[] typeParameters, Val[] parameters) {
\r
58 BoundVar target = new BoundVar(valRef.getBinding().getType());
\r
59 parent.addStatement(new LetApply(target, Types.NO_EFFECTS, function.createOccurrence(typeParameters), ValRef.createOccurrences(parameters)));
\r
60 valRef.replaceBy(target);
\r
63 public boolean isJump(Cont cont, Val parameter) {
\r
67 public abstract SSABlock[] getSuccessors();
\r
69 public void prepare(MethodBuilder mb) {
\r