]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/EqualsFunction.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / java / EqualsFunction.java
1 package org.simantics.scl.compiler.elaboration.java;
2
3 import org.cojen.classfile.TypeDesc;
4 import org.objectweb.asm.Label;
5 import org.simantics.scl.compiler.constants.ComparisonFunction;
6 import org.simantics.scl.compiler.constants.FunctionValue;
7 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;
8 import org.simantics.scl.compiler.internal.codegen.references.Val;
9 import org.simantics.scl.compiler.internal.codegen.utils.Constants;
10 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
11 import org.simantics.scl.compiler.types.TVar;
12 import org.simantics.scl.compiler.types.Type;
13 import org.simantics.scl.compiler.types.Types;
14 import org.simantics.scl.compiler.types.kinds.Kinds;
15
16 public class EqualsFunction extends FunctionValue implements ComparisonFunction {
17     private static final TVar A = Types.var(Kinds.STAR);
18     public static final EqualsFunction INSTANCE = new EqualsFunction();
19     
20     private EqualsFunction() {
21         super(new TVar[] {A}, Types.NO_EFFECTS, Types.BOOLEAN, A, A);
22     }
23
24     @Override
25     public Type applyExact(MethodBuilder mb, Val[] parameters) {
26         parameters[0].push(mb);
27         parameters[1].push(mb);
28         TypeDesc parameterType = mb.getJavaTypeTranslator().getTypeDesc(parameters[0]);
29         if(parameterType.isPrimitive()) {
30             if(parameterType.equals(TypeDesc.VOID)) {
31                 mb.loadConstant(true);
32             }
33             else {
34                 Label end = mb.createLabel();
35                 Label isEqual = mb.createLabel();
36                 mb.ifComparisonBranch(isEqual, "==", parameterType);
37                 mb.loadConstant(false);
38                 mb.branch(end);
39                 mb.setLocation(isEqual);
40                 mb.loadConstant(true);
41                 mb.setLocation(end);
42             }
43         }
44         else
45             mb.invokeStatic("java/util/Objects", "equals", TypeDesc.BOOLEAN, Constants.OBJECTS[2]);
46         return Types.BOOLEAN;
47     }
48     
49     @Override
50     public String toString() {
51         return "==";
52     }
53
54     @Override
55     public void generateCondition(MethodBuilder mb, Val[] parameters, Cont then_, Cont else_) {
56         parameters[0].push(mb);
57         parameters[1].push(mb);
58         TypeDesc parameterType = mb.getJavaTypeTranslator().getTypeDesc(parameters[0]);
59         if(parameterType.isPrimitive()) {
60             if(parameterType.equals(TypeDesc.VOID)) {
61                 mb.jump(then_);
62             }
63             else {
64                 mb.ifComparisonBranch(mb.getLabel(then_), "==", parameterType);
65                 mb.jump(else_);
66                 mb.ensureExists(then_);
67             }
68         }
69         else {
70             mb.invokeStatic("java/util/Objects", "equals", TypeDesc.BOOLEAN, Constants.OBJECTS[2]);
71             mb.ifZeroComparisonBranch(mb.getLabel(else_), "==");
72             mb.jump(then_);
73             mb.ensureExists(else_);
74         }
75     }
76 }