1 package org.simantics.scl.compiler.constants.singletons;
\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
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
19 private NullCheck() {
\r
20 super(new TVar[] {A}, Types.NO_EFFECTS, Types.BOOLEAN, A);
\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
31 mb.setLocation(isNull);
\r
32 mb.loadConstant(true);
\r
33 mb.setLocation(join);
\r
34 return getReturnType();
\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
42 mb.ensureExists(then_);
\r
46 public String toString() {
\r