]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaComparisonOperation.java
Merge "Ensure GetElementClassRequest is not constructed without elementFactory"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / JavaComparisonOperation.java
1 package org.simantics.scl.compiler.constants;
2
3
4 import org.objectweb.asm.Label;
5 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;
6 import org.simantics.scl.compiler.internal.codegen.references.Val;
7 import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;
8 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
9 import org.simantics.scl.compiler.types.TVar;
10 import org.simantics.scl.compiler.types.Type;
11 import org.simantics.scl.compiler.types.Types;
12
13 public class JavaComparisonOperation extends FunctionValue implements ComparisonFunction {
14     public static final JavaComparisonOperation IEQUAL = new JavaComparisonOperation("==", Types.INTEGER);
15     public static final JavaComparisonOperation INOT_EQUAL = new JavaComparisonOperation("!=", Types.INTEGER);
16     public static final JavaComparisonOperation ILESS = new JavaComparisonOperation("<", Types.INTEGER);
17     public static final JavaComparisonOperation ILESS_OR_EQUAL = new JavaComparisonOperation("<=", Types.INTEGER);
18     public static final JavaComparisonOperation IGREATER = new JavaComparisonOperation(">", Types.INTEGER);
19     public static final JavaComparisonOperation IGREATER_OR_EQUAL = new JavaComparisonOperation(">=", Types.INTEGER);
20     
21     String op;
22     
23     public JavaComparisonOperation(String op, Type type) {
24         super(TVar.EMPTY_ARRAY, Types.NO_EFFECTS, Types.BOOLEAN, type, type);
25         this.op = op;
26     }
27
28     @Override
29     public Type applyExact(MethodBuilder mb, Val[] parameters) {
30         JavaTypeTranslator tt = mb.getJavaTypeTranslator();
31         Label thenBranch = mb.createLabel();
32         Label joinPoint = mb.createLabel();
33         Type type = parameterTypes[0];
34         
35         mb.push(parameters[0], type);        
36         mb.push(parameters[1], type);
37         mb.ifComparisonBranch(thenBranch, op, tt.toTypeDesc(type));
38         
39         mb.loadConstant(false);
40         mb.branch(joinPoint);
41         
42         mb.setLocation(thenBranch);
43         mb.loadConstant(true);
44         mb.setLocation(joinPoint);
45         
46         return getReturnType();
47     }
48     
49     @Override
50     public String toString() {
51         return "(" + op + ")";
52     }
53
54     @Override
55     public void generateCondition(MethodBuilder mb, Val[] parameters, Cont then_, Cont else_) {
56         JavaTypeTranslator tt = mb.getJavaTypeTranslator();
57         Type type = parameterTypes[0];
58         mb.push(parameters[0], type);        
59         mb.push(parameters[1], type);
60         mb.ifComparisonBranch(mb.getLabel(then_), op, tt.toTypeDesc(type));
61         mb.jump(else_);
62         mb.ensureExists(then_);
63     }
64
65 }