1 package org.simantics.scl.compiler.internal.codegen.ssa;
3 import java.util.ArrayList;
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;
23 public abstract class SSAExit implements Printable {
25 public final int lineNumber;
27 public SSAExit(int lineNumber) {
28 this.lineNumber = lineNumber;
31 public abstract void generateCode(MethodBuilder mb);
33 public abstract void validate(SSAValidationContext context);
35 public void simplify(SSASimplificationContext context) {
38 public abstract void destroy();
41 public String toString() {
42 PrintingContext context = new PrintingContext();
44 return context.toString();
47 public SSABlock getParent() {
51 public abstract SSAExit copy(CopyContext context);
52 public abstract void replace(TVar[] vars, Type[] replacements);
54 public abstract void collectFreeVariables(SSAFunction function, ArrayList<ValRef> vars);
56 public abstract Cont addParametersInFrontOf(ContRef contRef, Val[] newParameters, Val[] oldParameters, Cont proxy);
58 public SSAFunction getParentFunction() {
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);
68 public boolean isJump(Cont cont, Val parameter) {
72 public abstract SSABlock[] getSuccessors();
74 public void prepare(MethodBuilder mb) {
77 public abstract void forValRefs(ValRefVisitor visitor);
79 public abstract void cleanup();