]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
index 3a4087c893024e5a076da8b5a0f468744cde9804..c2d3e6d0f1bbf666089919b305f5b6495b45967a 100644 (file)
@@ -2,7 +2,9 @@ package org.simantics.scl.compiler.elaboration.java;
 \r
 import org.cojen.classfile.TypeDesc;\r
 import org.objectweb.asm.Label;\r
+import org.simantics.scl.compiler.constants.ComparisonFunction;\r
 import org.simantics.scl.compiler.constants.FunctionValue;\r
+import org.simantics.scl.compiler.internal.codegen.continuations.Cont;\r
 import org.simantics.scl.compiler.internal.codegen.references.Val;\r
 import org.simantics.scl.compiler.internal.codegen.utils.Constants;\r
 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;\r
@@ -11,7 +13,7 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
-public class EqualsFunction extends FunctionValue {\r
+public class EqualsFunction extends FunctionValue implements ComparisonFunction {\r
     private static final TVar A = Types.var(Kinds.STAR);\r
     public static final EqualsFunction INSTANCE = new EqualsFunction();\r
     \r
@@ -43,4 +45,32 @@ public class EqualsFunction extends FunctionValue {
             mb.invokeStatic("java/util/Objects", "equals", TypeDesc.BOOLEAN, Constants.OBJECTS[2]);\r
         return Types.BOOLEAN;\r
     }\r
+    \r
+    @Override\r
+    public String toString() {\r
+        return "==";\r
+    }\r
+\r
+    @Override\r
+    public void generateCondition(MethodBuilder mb, Val[] parameters, Cont then_, Cont else_) {\r
+        parameters[0].push(mb);\r
+        parameters[1].push(mb);\r
+        TypeDesc parameterType = mb.getJavaTypeTranslator().getTypeDesc(parameters[0]);\r
+        if(parameterType.isPrimitive()) {\r
+            if(parameterType.equals(TypeDesc.VOID)) {\r
+                mb.jump(then_);\r
+            }\r
+            else {\r
+                mb.ifComparisonBranch(mb.getLabel(then_), "==", parameterType);\r
+                mb.jump(else_);\r
+                mb.ensureExists(then_);\r
+            }\r
+        }\r
+        else {\r
+            mb.invokeStatic("java/util/Objects", "equals", TypeDesc.BOOLEAN, Constants.OBJECTS[2]);\r
+            mb.ifZeroComparisonBranch(mb.getLabel(else_), "==");\r
+            mb.jump(then_);\r
+            mb.ensureExists(else_);\r
+        }\r
+    }\r
 }\r