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