]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/singletons/NullCheck.java
Merge "Remove unused import in DeleteHandler"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / singletons / NullCheck.java
1 package org.simantics.scl.compiler.constants.singletons;\r
2 \r
3 import org.objectweb.asm.Label;\r
4 import org.simantics.scl.compiler.constants.ComparisonFunction;\r
5 import org.simantics.scl.compiler.constants.FunctionValue;\r
6 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;\r
7 import org.simantics.scl.compiler.internal.codegen.references.Val;\r
8 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;\r
9 import org.simantics.scl.compiler.types.TVar;\r
10 import org.simantics.scl.compiler.types.Type;\r
11 import org.simantics.scl.compiler.types.Types;\r
12 import org.simantics.scl.compiler.types.kinds.Kinds;\r
13 \r
14 public class NullCheck extends FunctionValue implements ComparisonFunction {\r
15     private static final TVar A = Types.var(Kinds.STAR);\r
16     public static final NullCheck INSTANCE = \r
17             new NullCheck();\r
18     \r
19     private NullCheck() {\r
20         super(new TVar[] {A}, Types.NO_EFFECTS, Types.BOOLEAN, A);\r
21     }\r
22         \r
23     @Override\r
24     public Type applyExact(MethodBuilder mb, Val[] parameters) {\r
25         parameters[0].push(mb);\r
26         Label join = mb.createLabel();\r
27         Label isNull = mb.createLabel();\r
28         mb.ifNullBranch(isNull, true);\r
29         mb.loadConstant(false);\r
30         mb.branch(join);\r
31         mb.setLocation(isNull);\r
32         mb.loadConstant(true);\r
33         mb.setLocation(join);\r
34         return getReturnType();\r
35     }\r
36     \r
37     @Override\r
38     public void generateCondition(MethodBuilder mb, Val[] parameters, Cont then_, Cont else_) {\r
39         parameters[0].push(mb);\r
40         mb.ifNullBranch(mb.getLabel(then_), true);\r
41         mb.jump(else_);\r
42         mb.ensureExists(then_);\r
43     }\r
44 \r
45     @Override\r
46     public String toString() {\r
47          return "nullCheck";\r
48     }\r
49 }\r