You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2013/09/15 01:39:05 UTC

svn commit: r1523358 - /lucene/dev/branches/lucene5207/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java

Author: uschindler
Date: Sat Sep 14 23:39:05 2013
New Revision: 1523358

URL: http://svn.apache.org/r1523358
Log:
LUCENE-5207: More simplifications

Modified:
    lucene/dev/branches/lucene5207/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java

Modified: lucene/dev/branches/lucene5207/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5207/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java?rev=1523358&r1=1523357&r2=1523358&view=diff
==============================================================================
--- lucene/dev/branches/lucene5207/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java (original)
+++ lucene/dev/branches/lucene5207/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java Sat Sep 14 23:39:05 2013
@@ -16,6 +16,33 @@ package org.apache.lucene.expressions.js
  * limitations under the License.
  */
 
+import static org.objectweb.asm.Opcodes.ACC_FINAL;
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACC_SUPER;
+import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC;
+import static org.objectweb.asm.Opcodes.DADD;
+import static org.objectweb.asm.Opcodes.DCMPG;
+import static org.objectweb.asm.Opcodes.DCMPL;
+import static org.objectweb.asm.Opcodes.DDIV;
+import static org.objectweb.asm.Opcodes.DNEG;
+import static org.objectweb.asm.Opcodes.DREM;
+import static org.objectweb.asm.Opcodes.DSUB;
+import static org.objectweb.asm.Opcodes.GOTO;
+import static org.objectweb.asm.Opcodes.IFEQ;
+import static org.objectweb.asm.Opcodes.IFGE;
+import static org.objectweb.asm.Opcodes.IFGT;
+import static org.objectweb.asm.Opcodes.IFLE;
+import static org.objectweb.asm.Opcodes.IFLT;
+import static org.objectweb.asm.Opcodes.IFNE;
+import static org.objectweb.asm.Opcodes.ILOAD;
+import static org.objectweb.asm.Opcodes.LAND;
+import static org.objectweb.asm.Opcodes.LOR;
+import static org.objectweb.asm.Opcodes.LSHL;
+import static org.objectweb.asm.Opcodes.LSHR;
+import static org.objectweb.asm.Opcodes.LUSHR;
+import static org.objectweb.asm.Opcodes.LXOR;
+import static org.objectweb.asm.Opcodes.V1_7;
+
 import java.io.IOException;
 import java.io.Reader;
 import java.lang.reflect.Constructor;
@@ -40,63 +67,10 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.util.IOUtils;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 import org.objectweb.asm.commons.GeneratorAdapter;
 
-import static org.objectweb.asm.Opcodes.AALOAD;
-import static org.objectweb.asm.Opcodes.ACC_FINAL;
-import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
-import static org.objectweb.asm.Opcodes.ACC_SUPER;
-import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC;
-import static org.objectweb.asm.Opcodes.ALOAD;
-import static org.objectweb.asm.Opcodes.BIPUSH;
-import static org.objectweb.asm.Opcodes.D2I;
-import static org.objectweb.asm.Opcodes.D2L;
-import static org.objectweb.asm.Opcodes.DADD;
-import static org.objectweb.asm.Opcodes.DCMPG;
-import static org.objectweb.asm.Opcodes.DCMPL;
-import static org.objectweb.asm.Opcodes.DCONST_0;
-import static org.objectweb.asm.Opcodes.DCONST_1;
-import static org.objectweb.asm.Opcodes.DDIV;
-import static org.objectweb.asm.Opcodes.DNEG;
-import static org.objectweb.asm.Opcodes.DREM;
-import static org.objectweb.asm.Opcodes.DRETURN;
-import static org.objectweb.asm.Opcodes.DSUB;
-import static org.objectweb.asm.Opcodes.GOTO;
-import static org.objectweb.asm.Opcodes.I2D;
-import static org.objectweb.asm.Opcodes.I2L;
-import static org.objectweb.asm.Opcodes.ICONST_0;
-import static org.objectweb.asm.Opcodes.ICONST_1;
-import static org.objectweb.asm.Opcodes.ICONST_2;
-import static org.objectweb.asm.Opcodes.ICONST_3;
-import static org.objectweb.asm.Opcodes.ICONST_4;
-import static org.objectweb.asm.Opcodes.ICONST_5;
-import static org.objectweb.asm.Opcodes.IFEQ;
-import static org.objectweb.asm.Opcodes.IFGE;
-import static org.objectweb.asm.Opcodes.IFGT;
-import static org.objectweb.asm.Opcodes.IFLE;
-import static org.objectweb.asm.Opcodes.IFLT;
-import static org.objectweb.asm.Opcodes.IFNE;
-import static org.objectweb.asm.Opcodes.ILOAD;
-import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
-import static org.objectweb.asm.Opcodes.INVOKESTATIC;
-import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
-import static org.objectweb.asm.Opcodes.L2D;
-import static org.objectweb.asm.Opcodes.L2I;
-import static org.objectweb.asm.Opcodes.LAND;
-import static org.objectweb.asm.Opcodes.LCONST_0;
-import static org.objectweb.asm.Opcodes.LCONST_1;
-import static org.objectweb.asm.Opcodes.LOR;
-import static org.objectweb.asm.Opcodes.LSHL;
-import static org.objectweb.asm.Opcodes.LSHR;
-import static org.objectweb.asm.Opcodes.LUSHR;
-import static org.objectweb.asm.Opcodes.LXOR;
-import static org.objectweb.asm.Opcodes.RETURN;
-import static org.objectweb.asm.Opcodes.SIPUSH;
-import static org.objectweb.asm.Opcodes.V1_7;
-
 /**
  * An expression compiler for javascript expressions.
  * <p>
@@ -111,9 +85,6 @@ import static org.objectweb.asm.Opcodes.
  * @lucene.experimental
  */
 public class JavascriptCompiler {
-  private static enum ComputedType {
-    INT, LONG, DOUBLE
-  }
 
   static class Loader extends ClassLoader {
     Loader(ClassLoader parent) {
@@ -194,7 +165,7 @@ public class JavascriptCompiler {
    * If this method fails to compile, you also have to change the byte code generator to correctly
    * use the FunctionValues class.
    */
-  @SuppressWarnings("unused")
+  @SuppressWarnings({"unused", "null"})
   private static void unusedTestCompile() {
     FunctionValues f = null;
     double ret = f.doubleVal(2);
@@ -231,7 +202,7 @@ public class JavascriptCompiler {
       Tree antlrTree = getAntlrComputedExpressionTree();
       
       beginCompile();
-      recursiveCompile(antlrTree, ComputedType.DOUBLE);
+      recursiveCompile(antlrTree, Type.DOUBLE_TYPE);
       endCompile();
       
       Class<? extends Expression> evaluatorClass = new Loader(parent)
@@ -251,8 +222,7 @@ public class JavascriptCompiler {
     
     GeneratorAdapter constructor = new GeneratorAdapter(ACC_PUBLIC | ACC_SYNTHETIC, EXPRESSION_CTOR, null, null, classWriter);
     constructor.loadThis();
-    constructor.loadArg(0);
-    constructor.loadArg(1);
+    constructor.loadArgs();
     constructor.invokeConstructor(EXPRESSION_TYPE, EXPRESSION_CTOR);
     constructor.returnValue();
     constructor.endMethod();
@@ -260,7 +230,7 @@ public class JavascriptCompiler {
     methodVisitor = new GeneratorAdapter(ACC_PUBLIC | ACC_SYNTHETIC, EVALUATE_METHOD, null, null, classWriter);
   }
   
-  private void recursiveCompile(Tree current, ComputedType expected) {
+  private void recursiveCompile(Tree current, Type expected) {
     int type = current.getType();
     String text = current.getText();
     
@@ -282,13 +252,13 @@ public class JavascriptCompiler {
         }
         
         for (int argument = 1; argument <= arguments; ++argument) {
-          recursiveCompile(current.getChild(argument), ComputedType.DOUBLE);
+          recursiveCompile(current.getChild(argument), Type.DOUBLE_TYPE);
         }
         
         methodVisitor.invokeStatic(Type.getType(method.getDeclaringClass()),
           org.objectweb.asm.commons.Method.getMethod(method));
         
-        typeCompile(expected, ComputedType.DOUBLE);
+        methodVisitor.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.ID:
         int index;
@@ -300,138 +270,123 @@ public class JavascriptCompiler {
           externalsMap.put(text, index);
         }
         
-        methodVisitor.visitVarInsn(ALOAD, 2);
+        methodVisitor.loadArg(1);
         methodVisitor.push(index);
-        methodVisitor.visitInsn(AALOAD);
+        methodVisitor.arrayLoad(FUNCTION_VALUES_TYPE);
         methodVisitor.visitVarInsn(ILOAD, 1);
         methodVisitor.invokeVirtual(FUNCTION_VALUES_TYPE, DOUBLE_VAL_METHOD);
         
-        typeCompile(expected, ComputedType.DOUBLE);
+        methodVisitor.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.HEX:
         long hex = Long.parseLong(text.substring(2), 16);
         
-        if (expected == ComputedType.INT) {
-          methodVisitor.visitLdcInsn((int)hex);
-        } else if (expected == ComputedType.LONG) {
-          methodVisitor.visitLdcInsn(hex);
+        if (expected == Type.INT_TYPE) {
+          methodVisitor.push((int)hex);
+        } else if (expected == Type.LONG_TYPE) {
+          methodVisitor.push(hex);
         } else {
-          methodVisitor.visitLdcInsn((double)hex);
+          methodVisitor.push((double)hex);
         }
         break;
       case JavascriptParser.OCTAL:
         long octal = Long.parseLong(text.substring(1), 8);
         
-        if (expected == ComputedType.INT) {
-          methodVisitor.visitLdcInsn((int)octal);
-        } else if (expected == ComputedType.LONG) {
-          methodVisitor.visitLdcInsn(octal);
+        if (expected == Type.INT_TYPE) {
+          methodVisitor.push((int)octal);
+        } else if (expected == Type.LONG_TYPE) {
+          methodVisitor.push(octal);
         } else {
-          methodVisitor.visitLdcInsn((double)octal);
+          methodVisitor.push((double)octal);
         }
         break;
       case JavascriptParser.DECIMAL:
         double decimal = Double.parseDouble(text);
-        methodVisitor.visitLdcInsn(decimal);
-        
-        typeCompile(expected, ComputedType.DOUBLE);
+        methodVisitor.push(decimal);
+        methodVisitor.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.AT_NEGATE:
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DNEG);
-        
-        typeCompile(expected, ComputedType.DOUBLE);
+        methodVisitor.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.AT_ADD:
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DADD);
-        
-        typeCompile(expected, ComputedType.DOUBLE);
+        methodVisitor.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.AT_SUBTRACT:
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DSUB);
-        
-        typeCompile(expected, ComputedType.DOUBLE);
+        methodVisitor.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.AT_MULTIPLY:
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(Opcodes.DMUL);
-        
-        typeCompile(expected, ComputedType.DOUBLE);
+        methodVisitor.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.AT_DIVIDE:
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DDIV);
-        
-        typeCompile(expected, ComputedType.DOUBLE);
+        methodVisitor.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.AT_MODULO:
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DREM);
-        
-        typeCompile(expected, ComputedType.DOUBLE);
+        methodVisitor.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.AT_BIT_SHL:
-        recursiveCompile(current.getChild(0), ComputedType.LONG);
-        recursiveCompile(current.getChild(1), ComputedType.INT);
+        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
+        recursiveCompile(current.getChild(1), Type.INT_TYPE);
         methodVisitor.visitInsn(LSHL);
-        
-        typeCompile(expected, ComputedType.LONG);
+        methodVisitor.cast(Type.LONG_TYPE, expected);
         break;
       case JavascriptParser.AT_BIT_SHR:
-        recursiveCompile(current.getChild(0), ComputedType.LONG);
-        recursiveCompile(current.getChild(1), ComputedType.INT);
+        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
+        recursiveCompile(current.getChild(1), Type.INT_TYPE);
         methodVisitor.visitInsn(LSHR);
-        
-        typeCompile(expected, ComputedType.LONG);
+        methodVisitor.cast(Type.LONG_TYPE, expected);
         break;
       case JavascriptParser.AT_BIT_SHU:
-        recursiveCompile(current.getChild(0), ComputedType.LONG);
-        recursiveCompile(current.getChild(1), ComputedType.INT);
+        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
+        recursiveCompile(current.getChild(1), Type.INT_TYPE);
         methodVisitor.visitInsn(LUSHR);
-        
-        typeCompile(expected, ComputedType.LONG);
+        methodVisitor.cast(Type.LONG_TYPE, expected);
         break;
       case JavascriptParser.AT_BIT_AND:
-        recursiveCompile(current.getChild(0), ComputedType.LONG);
-        recursiveCompile(current.getChild(1), ComputedType.LONG);
+        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
+        recursiveCompile(current.getChild(1), Type.LONG_TYPE);
         methodVisitor.visitInsn(LAND);
-        
-        typeCompile(expected, ComputedType.LONG);
+        methodVisitor.cast(Type.LONG_TYPE, expected);
         break;
       case JavascriptParser.AT_BIT_OR:
-        recursiveCompile(current.getChild(0), ComputedType.LONG);
-        recursiveCompile(current.getChild(1), ComputedType.LONG);
+        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
+        recursiveCompile(current.getChild(1), Type.LONG_TYPE);
         methodVisitor.visitInsn(LOR);
-        
-        typeCompile(expected, ComputedType.LONG);            
+        methodVisitor.cast(Type.LONG_TYPE, expected);            
         break;
       case JavascriptParser.AT_BIT_XOR:
-        recursiveCompile(current.getChild(0), ComputedType.LONG);
-        recursiveCompile(current.getChild(1), ComputedType.LONG);
+        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
+        recursiveCompile(current.getChild(1), Type.LONG_TYPE);
         methodVisitor.visitInsn(LXOR);
-        
-        typeCompile(expected, ComputedType.LONG);            
+        methodVisitor.cast(Type.LONG_TYPE, expected);            
         break;
       case JavascriptParser.AT_BIT_NOT:
-        recursiveCompile(current.getChild(0), ComputedType.LONG);
+        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
         methodVisitor.visitLdcInsn(new Long(-1));
         methodVisitor.visitInsn(LXOR);
-        
-        typeCompile(expected, ComputedType.LONG);
+        methodVisitor.cast(Type.LONG_TYPE, expected);
         break;
       case JavascriptParser.AT_COMP_EQ:
         Label labelEqTrue = new Label();
         Label labelEqReturn = new Label();
-        
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DCMPL);
         
         methodVisitor.visitJumpInsn(IFEQ, labelEqTrue);
@@ -445,8 +400,8 @@ public class JavascriptCompiler {
         Label labelNeqTrue = new Label();
         Label labelNeqReturn = new Label();
         
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DCMPL);
         
         methodVisitor.visitJumpInsn(IFNE, labelNeqTrue);
@@ -460,8 +415,8 @@ public class JavascriptCompiler {
         Label labelLtTrue = new Label();
         Label labelLtReturn = new Label();
         
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DCMPG);
         
         methodVisitor.visitJumpInsn(IFLT, labelLtTrue);
@@ -475,8 +430,8 @@ public class JavascriptCompiler {
         Label labelGtTrue = new Label();
         Label labelGtReturn = new Label();
         
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DCMPL);
         
         methodVisitor.visitJumpInsn(IFGT, labelGtTrue);
@@ -490,8 +445,8 @@ public class JavascriptCompiler {
         Label labelLteTrue = new Label();
         Label labelLteReturn = new Label();
         
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DCMPG);
         
         methodVisitor.visitJumpInsn(IFLE, labelLteTrue);
@@ -505,8 +460,8 @@ public class JavascriptCompiler {
         Label labelGteTrue = new Label();
         Label labelGteReturn = new Label();
         
-        recursiveCompile(current.getChild(0), ComputedType.DOUBLE);
-        recursiveCompile(current.getChild(1), ComputedType.DOUBLE);
+        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
         methodVisitor.visitInsn(DCMPL);
         
         methodVisitor.visitJumpInsn(IFGE, labelGteTrue);
@@ -520,7 +475,7 @@ public class JavascriptCompiler {
         Label labelNotTrue = new Label();
         Label labelNotReturn = new Label();
         
-        recursiveCompile(current.getChild(0), ComputedType.INT);
+        recursiveCompile(current.getChild(0), Type.INT_TYPE);
         methodVisitor.visitJumpInsn(IFEQ, labelNotTrue);
         truthCompile(expected, false);
         methodVisitor.visitJumpInsn(GOTO, labelNotReturn);
@@ -532,9 +487,9 @@ public class JavascriptCompiler {
         Label andFalse = new Label();
         Label andEnd = new Label();
         
-        recursiveCompile(current.getChild(0), ComputedType.INT);
+        recursiveCompile(current.getChild(0), Type.INT_TYPE);
         methodVisitor.visitJumpInsn(IFEQ, andFalse);
-        recursiveCompile(current.getChild(1), ComputedType.INT);
+        recursiveCompile(current.getChild(1), Type.INT_TYPE);
         methodVisitor.visitJumpInsn(IFEQ, andFalse);
         truthCompile(expected, true);
         methodVisitor.visitJumpInsn(GOTO, andEnd);
@@ -546,9 +501,9 @@ public class JavascriptCompiler {
         Label orTrue = new Label();
         Label orEnd = new Label();
         
-        recursiveCompile(current.getChild(0), ComputedType.INT);
+        recursiveCompile(current.getChild(0), Type.INT_TYPE);
         methodVisitor.visitJumpInsn(IFNE, orTrue);
-        recursiveCompile(current.getChild(1), ComputedType.INT);
+        recursiveCompile(current.getChild(1), Type.INT_TYPE);
         methodVisitor.visitJumpInsn(IFNE, orTrue);
         truthCompile(expected, false);
         methodVisitor.visitJumpInsn(GOTO, orEnd);
@@ -560,7 +515,7 @@ public class JavascriptCompiler {
         Label condFalse = new Label();
         Label condEnd = new Label();
         
-        recursiveCompile(current.getChild(0), ComputedType.INT);
+        recursiveCompile(current.getChild(0), Type.INT_TYPE);
         methodVisitor.visitJumpInsn(IFEQ, condFalse);
         recursiveCompile(current.getChild(1), expected);
         methodVisitor.visitJumpInsn(GOTO, condEnd);
@@ -573,47 +528,15 @@ public class JavascriptCompiler {
     }
   }
   
-  private void typeCompile(ComputedType expected, ComputedType actual) {
-    if (expected == actual) {
-      return;
-    }
-    
-    switch (expected) {
-      case INT:
-        if (actual == ComputedType.LONG) {
-          methodVisitor.visitInsn(L2I);
-        } else {
-          methodVisitor.visitInsn(D2I);
-        }
-        break;
-      case LONG:
-        if (actual == ComputedType.INT) {
-          methodVisitor.visitInsn(I2L);
-        } else {
-          methodVisitor.visitInsn(D2L);
-        }
-        break;
-      default:
-        if (actual == ComputedType.INT) {
-          methodVisitor.visitInsn(I2D);
-        } else {
-          methodVisitor.visitInsn(L2D);
-        }
-        break;
-    }
-  }
-  
-  private void truthCompile(ComputedType expected, boolean truth) {
-    switch (expected) {
-      case INT:
-        methodVisitor.visitInsn(truth ? ICONST_1 : ICONST_0);
-        break;
-      case LONG:
-        methodVisitor.visitInsn(truth ? LCONST_1 : LCONST_0);
-        break;
-      default:
-        methodVisitor.visitInsn(truth ? DCONST_1 : DCONST_0);
-        break;
+  private void truthCompile(Type expected, boolean truth) {
+    if (expected == Type.INT_TYPE) {
+        methodVisitor.push(truth);
+    } else if (expected == Type.LONG_TYPE) {
+        methodVisitor.push((long) (truth ? 1 : 0));
+    } else if (expected == Type.DOUBLE_TYPE) {
+        methodVisitor.push(truth ? 1. : 0.);
+    } else {
+      throw new IllegalStateException("Invalid expected type");
     }
   }