]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaComparisonOperation.java
Merged changes from feature/scl to master.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / JavaComparisonOperation.java
index 684e7ed5d8454646a6e61da67e4abd179bd057b6..53cbfd7aa53edf57f71ce324bdd7b3294ad716cf 100644 (file)
@@ -2,6 +2,7 @@ package org.simantics.scl.compiler.constants;
 
 
 import org.objectweb.asm.Label;
+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.types.JavaTypeTranslator;
 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
@@ -9,7 +10,13 @@ import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 
-public class JavaComparisonOperation extends FunctionValue {
+public class JavaComparisonOperation extends FunctionValue implements ComparisonFunction {
+    public static final JavaComparisonOperation IEQUAL = new JavaComparisonOperation("==", Types.INTEGER);
+    public static final JavaComparisonOperation INOT_EQUAL = new JavaComparisonOperation("!=", Types.INTEGER);
+    public static final JavaComparisonOperation ILESS = new JavaComparisonOperation("<", Types.INTEGER);
+    public static final JavaComparisonOperation ILESS_OR_EQUAL = new JavaComparisonOperation("<=", Types.INTEGER);
+    public static final JavaComparisonOperation IGREATER = new JavaComparisonOperation(">", Types.INTEGER);
+    public static final JavaComparisonOperation IGREATER_OR_EQUAL = new JavaComparisonOperation(">=", Types.INTEGER);
     
     String op;
     
@@ -23,10 +30,11 @@ public class JavaComparisonOperation extends FunctionValue {
         JavaTypeTranslator tt = mb.getJavaTypeTranslator();
         Label thenBranch = mb.createLabel();
         Label joinPoint = mb.createLabel();
+        Type type = parameterTypes[0];
         
         mb.push(parameters[0], type);        
         mb.push(parameters[1], type);
-        mb.ifComparisonBranch(thenBranch, op, tt.toTypeDesc(parameterTypes[0]));
+        mb.ifComparisonBranch(thenBranch, op, tt.toTypeDesc(type));
         
         mb.loadConstant(false);
         mb.branch(joinPoint);
@@ -43,4 +51,15 @@ public class JavaComparisonOperation extends FunctionValue {
         return "(" + op + ")";
     }
 
+    @Override
+    public void generateCondition(MethodBuilder mb, Val[] parameters, Cont then_, Cont else_) {
+        JavaTypeTranslator tt = mb.getJavaTypeTranslator();
+        Type type = parameterTypes[0];
+        mb.push(parameters[0], type);        
+        mb.push(parameters[1], type);
+        mb.ifComparisonBranch(mb.getLabel(then_), op, tt.toTypeDesc(type));
+        mb.jump(else_);
+        mb.ensureExists(then_);
+    }
+
 }