X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fjava%2FEqualsFunction.java;h=c2d3e6d0f1bbf666089919b305f5b6495b45967a;hp=3a4087c893024e5a076da8b5a0f468744cde9804;hb=a8758de5bc19e5adb3f618d3038743a164f09912;hpb=12d9af17384d960b75d58c3935d2b7b46d93e87b diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/EqualsFunction.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/EqualsFunction.java index 3a4087c89..c2d3e6d0f 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/EqualsFunction.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/EqualsFunction.java @@ -2,7 +2,9 @@ package org.simantics.scl.compiler.elaboration.java; import org.cojen.classfile.TypeDesc; import org.objectweb.asm.Label; +import org.simantics.scl.compiler.constants.ComparisonFunction; import org.simantics.scl.compiler.constants.FunctionValue; +import org.simantics.scl.compiler.internal.codegen.continuations.Cont; import org.simantics.scl.compiler.internal.codegen.references.Val; import org.simantics.scl.compiler.internal.codegen.utils.Constants; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; @@ -11,7 +13,7 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.kinds.Kinds; -public class EqualsFunction extends FunctionValue { +public class EqualsFunction extends FunctionValue implements ComparisonFunction { private static final TVar A = Types.var(Kinds.STAR); public static final EqualsFunction INSTANCE = new EqualsFunction(); @@ -43,4 +45,32 @@ public class EqualsFunction extends FunctionValue { mb.invokeStatic("java/util/Objects", "equals", TypeDesc.BOOLEAN, Constants.OBJECTS[2]); return Types.BOOLEAN; } + + @Override + public String toString() { + return "=="; + } + + @Override + public void generateCondition(MethodBuilder mb, Val[] parameters, Cont then_, Cont else_) { + parameters[0].push(mb); + parameters[1].push(mb); + TypeDesc parameterType = mb.getJavaTypeTranslator().getTypeDesc(parameters[0]); + if(parameterType.isPrimitive()) { + if(parameterType.equals(TypeDesc.VOID)) { + mb.jump(then_); + } + else { + mb.ifComparisonBranch(mb.getLabel(then_), "==", parameterType); + mb.jump(else_); + mb.ensureExists(then_); + } + } + else { + mb.invokeStatic("java/util/Objects", "equals", TypeDesc.BOOLEAN, Constants.OBJECTS[2]); + mb.ifZeroComparisonBranch(mb.getLabel(else_), "=="); + mb.jump(then_); + mb.ensureExists(else_); + } + } }