]> gerrit.simantics Code Review - simantics/platform.git/blob
b0391b96581cbe0df97d498589a862a23fe8b775
[simantics/platform.git] /
1 package org.simantics.scl.compiler.internal.codegen.ssa.exits;
2
3 import java.util.ArrayList;
4
5 import org.cojen.classfile.TypeDesc;
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.utils.Constants;
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;
21 import org.simantics.scl.runtime.exceptions.MatchingException;
22
23 public class Throw extends SSAExit {
24
25     public static final TypeDesc RuntimeException = 
26             TypeDesc.forClass(RuntimeException.class);
27     public static final TypeDesc MatchingException = 
28             TypeDesc.forClass(MatchingException.class);
29     
30     TypeDesc exceptionClass;
31     String description;
32     
33     public Throw(TypeDesc exceptionClass, String description) {
34         this.exceptionClass = exceptionClass;
35         this.description = description;
36     }
37
38     @Override
39     public void toString(PrintingContext context) {
40         context.append("throw\n");
41         //context.append(exception);
42     }
43
44     @Override
45     public void generateCode(MethodBuilder mb) {
46         //mb.push(exception.getBinding());
47         //cb.mapLineNumber(location);
48         mb.newObject(exceptionClass);
49         mb.dup();
50         if(description == null)
51             mb.invokeConstructor(exceptionClass, Constants.EMPTY_TYPEDESC_ARRAY);
52         else {
53             mb.loadConstant(description);
54             mb.invokeConstructor(exceptionClass, new TypeDesc[] {TypeDesc.STRING});
55         }
56         mb.throwObject();
57     }
58
59     @Override
60     public void validate(SSAValidationContext context) {
61     }
62
63     @Override
64     public void destroy() {
65         // TODO
66     }
67
68     @Override
69     public SSAExit copy(CopyContext context) {
70         return new Throw(exceptionClass, description);
71     }
72     
73     @Override
74     public void replace(TVar[] vars, Type[] replacements) {
75     }
76
77     @Override
78     public void collectFreeVariables(SSAFunction function,
79             ArrayList<ValRef> vars) {
80     }
81     
82     @Override
83     public Cont addParametersInFrontOf(ContRef contRef, Val[] newParameters, Val[] oldParameters,
84             Cont proxy) {
85         return proxy;
86     }
87
88     @Override
89     public SSABlock[] getSuccessors() {
90         return SSABlock.EMPTY_ARRAY;
91     }
92
93     @Override
94     public void forValRefs(ValRefVisitor visitor) {
95     }
96 }