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