1 package org.simantics.scl.compiler.internal.codegen.ssa.exits;
3 import java.util.ArrayList;
5 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
6 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;
7 import org.simantics.scl.compiler.internal.codegen.continuations.ContRef;
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.SSABlock;
11 import org.simantics.scl.compiler.internal.codegen.ssa.SSAExit;
12 import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;
13 import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder;
14 import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;
15 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
16 import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext;
17 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;
18 import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor;
19 import org.simantics.scl.compiler.types.TVar;
20 import org.simantics.scl.compiler.types.Type;
22 public class Jump extends SSAExit implements ValRefBinder {
23 private ContRef target;
24 private ValRef[] parameters;
26 public Jump(int lineNumber, ContRef target, ValRef ... parameters) {
29 setParameters(parameters);
32 public ContRef getTarget() {
36 public void setTarget(ContRef target) {
38 target.setParent(this);
41 public ValRef[] getParameters() {
45 public void setParameters(ValRef[] parameters) {
46 this.parameters = parameters;
47 for(ValRef parameter : parameters)
48 parameter.setParent(this);
52 public void generateCode(MethodBuilder mb) {
53 mb.lineNumber(lineNumber);
54 mb.jump(target, ValRef.getBindings(parameters));
58 public void toString(PrintingContext context) {
59 context.append(target);
60 for(ValRef parameter : parameters) {
62 context.append(parameter);
65 for(SSABlock block : getSuccessors())
66 context.addBlock(block);
71 public void validate(SSAValidationContext context) {
72 context.validate(target);
73 if(target.getParent() != this)
74 throw new InternalCompilerError();
75 for(ValRef parameter : parameters) {
76 context.validate(parameter);
77 if(parameter.getParent() != this)
78 throw new InternalCompilerError();
81 Cont cont = target.getBinding();
82 context.assertEquals(cont.getArity(), parameters.length);
83 //for(int i=0;i<parameters.length;++i)
84 // context.assertSubsumes(parameters[i].getType(), cont.getParameterType(i));
88 public void destroy() {
90 for(ValRef parameter : parameters)
95 public SSAExit copy(CopyContext context) {
96 return new Jump(lineNumber, context.copy(target), context.copy(parameters));
100 public void replace(TVar[] vars, Type[] replacements) {
101 for(ValRef parameter : parameters)
102 parameter.replace(vars, replacements);
106 public void collectFreeVariables(SSAFunction function,
107 ArrayList<ValRef> vars) {
108 for(ValRef parameter : parameters)
109 parameter.collectFreeVariables(function, vars);
113 public Cont addParametersInFrontOf(ContRef contRef, Val[] newParameters, Val[] oldParameters, Cont proxy) {
114 ValRef[] occurences = ValRef.createOccurrences(newParameters);
115 for(ValRef ref : occurences)
117 this.parameters = ValRef.concat(occurences, this.parameters);
121 public void setParameter(int position, ValRef parameter) {
122 parameters[position] = parameter;
123 parameter.setParent(this);
126 public ValRef getParameter(int position) {
127 return parameters[position];
131 public boolean isJump(Cont cont, Val parameter) {
132 return target.getBinding() == cont &&
133 parameters.length == 1 &&
134 parameters[0].getBinding() == parameter;
138 public SSABlock[] getSuccessors() {
139 Cont cont = target.getBinding();
140 if(cont instanceof SSABlock)
141 return new SSABlock[] {(SSABlock)cont};
143 return SSABlock.EMPTY_ARRAY;
147 public void forValRefs(ValRefVisitor visitor) {
148 for(ValRef parameter : parameters)
149 visitor.visit(parameter);
153 public void cleanup() {
154 for(ValRef parameter : parameters)