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

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

Author: rmuir
Date: Sun Sep 15 01:19:28 2013
New Revision: 1523382

URL: http://svn.apache.org/r1523382
Log:
LUCENE-5207: simplify some of operators

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=1523382&r1=1523381&r2=1523382&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 Sun Sep 15 01:19:28 2013
@@ -20,19 +20,8 @@ import static org.objectweb.asm.Opcodes.
 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.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.IFEQ;
 import static org.objectweb.asm.Opcodes.IFNE;
-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;
@@ -281,98 +270,65 @@ public class JavascriptCompiler {
         break;
       case JavascriptParser.AT_NEGATE:
         recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
-        gen.visitInsn(DNEG);
+        gen.visitInsn(Opcodes.DNEG);
         gen.cast(Type.DOUBLE_TYPE, expected);
         break;
       case JavascriptParser.AT_ADD:
-        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
-        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
-        gen.visitInsn(DADD);
-        gen.cast(Type.DOUBLE_TYPE, expected);
+        pushArith(Opcodes.DADD, current, expected);
         break;
       case JavascriptParser.AT_SUBTRACT:
-        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
-        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
-        gen.visitInsn(DSUB);
-        gen.cast(Type.DOUBLE_TYPE, expected);
+        pushArith(Opcodes.DSUB, current, expected);
         break;
       case JavascriptParser.AT_MULTIPLY:
-        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
-        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
-        gen.visitInsn(Opcodes.DMUL);
-        gen.cast(Type.DOUBLE_TYPE, expected);
+        pushArith(Opcodes.DMUL, current, expected);
         break;
       case JavascriptParser.AT_DIVIDE:
-        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
-        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
-        gen.visitInsn(DDIV);
-        gen.cast(Type.DOUBLE_TYPE, expected);
+        pushArith(Opcodes.DDIV, current, expected);
         break;
       case JavascriptParser.AT_MODULO:
-        recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
-        recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
-        gen.visitInsn(DREM);
-        gen.cast(Type.DOUBLE_TYPE, expected);
+        pushArith(Opcodes.DREM, current, expected);
         break;
       case JavascriptParser.AT_BIT_SHL:
-        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
-        recursiveCompile(current.getChild(1), Type.INT_TYPE);
-        gen.visitInsn(LSHL);
-        gen.cast(Type.LONG_TYPE, expected);
+        pushShift(Opcodes.LSHL, current, expected);
         break;
       case JavascriptParser.AT_BIT_SHR:
-        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
-        recursiveCompile(current.getChild(1), Type.INT_TYPE);
-        gen.visitInsn(LSHR);
-        gen.cast(Type.LONG_TYPE, expected);
+        pushShift(Opcodes.LSHR, current, expected);
         break;
       case JavascriptParser.AT_BIT_SHU:
-        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
-        recursiveCompile(current.getChild(1), Type.INT_TYPE);
-        gen.visitInsn(LUSHR);
-        gen.cast(Type.LONG_TYPE, expected);
+        pushShift(Opcodes.LUSHR, current, expected);
         break;
       case JavascriptParser.AT_BIT_AND:
-        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
-        recursiveCompile(current.getChild(1), Type.LONG_TYPE);
-        gen.visitInsn(LAND);
-        gen.cast(Type.LONG_TYPE, expected);
+        pushBitwise(Opcodes.LAND, current, expected);
         break;
       case JavascriptParser.AT_BIT_OR:
-        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
-        recursiveCompile(current.getChild(1), Type.LONG_TYPE);
-        gen.visitInsn(LOR);
-        gen.cast(Type.LONG_TYPE, expected);            
+        pushBitwise(Opcodes.LOR, current, expected);           
         break;
       case JavascriptParser.AT_BIT_XOR:
-        recursiveCompile(current.getChild(0), Type.LONG_TYPE);
-        recursiveCompile(current.getChild(1), Type.LONG_TYPE);
-        gen.visitInsn(LXOR);
-        gen.cast(Type.LONG_TYPE, expected);            
+        pushBitwise(Opcodes.LXOR, current, expected);           
         break;
       case JavascriptParser.AT_BIT_NOT:
         recursiveCompile(current.getChild(0), Type.LONG_TYPE);
         gen.push(-1L);
-        gen.visitInsn(LXOR);
+        gen.visitInsn(Opcodes.LXOR);
         gen.cast(Type.LONG_TYPE, expected);
         break;
       case JavascriptParser.AT_COMP_EQ:
-        compileCompare(GeneratorAdapter.EQ, current, expected);
+        pushCond(GeneratorAdapter.EQ, current, expected);
         break;
       case JavascriptParser.AT_COMP_NEQ:
-        compileCompare(GeneratorAdapter.NE, current, expected);
+        pushCond(GeneratorAdapter.NE, current, expected);
         break;
       case JavascriptParser.AT_COMP_LT:
-        compileCompare(GeneratorAdapter.LT, current, expected);
+        pushCond(GeneratorAdapter.LT, current, expected);
         break;
       case JavascriptParser.AT_COMP_GT:
-        compileCompare(GeneratorAdapter.GT, current, expected);
+        pushCond(GeneratorAdapter.GT, current, expected);
         break;
       case JavascriptParser.AT_COMP_LTE:
-        compileCompare(GeneratorAdapter.LE, current, expected);
+        pushCond(GeneratorAdapter.LE, current, expected);
         break;
       case JavascriptParser.AT_COMP_GTE:
-        compileCompare(GeneratorAdapter.GE, current, expected);
+        pushCond(GeneratorAdapter.GE, current, expected);
         break;
       case JavascriptParser.AT_BOOL_NOT:
         Label labelNotTrue = new Label();
@@ -430,8 +386,27 @@ public class JavascriptCompiler {
         throw new IllegalStateException("Unknown operation specified: (" + current.getText() + ").");
     }
   }
+
+  private void pushArith(int operator, Tree current, Type expected) {
+    pushBinaryOp(operator, current, expected, Type.DOUBLE_TYPE, Type.DOUBLE_TYPE, Type.DOUBLE_TYPE);
+  }
+  
+  private void pushShift(int operator, Tree current, Type expected) {
+    pushBinaryOp(operator, current, expected, Type.LONG_TYPE, Type.INT_TYPE, Type.LONG_TYPE);
+  }
+  
+  private void pushBitwise(int operator, Tree current, Type expected) {
+    pushBinaryOp(operator, current, expected, Type.LONG_TYPE, Type.LONG_TYPE, Type.LONG_TYPE);
+  }
+  
+  private void pushBinaryOp(int operator, Tree current, Type expected, Type arg1, Type arg2, Type returnType) {
+    recursiveCompile(current.getChild(0), arg1);
+    recursiveCompile(current.getChild(1), arg2);
+    gen.visitInsn(operator);
+    gen.cast(returnType, expected);
+  }
   
-  private void compileCompare(int operator, Tree current, Type expected) {
+  private void pushCond(int operator, Tree current, Type expected) {
     Label labelTrue = new Label();
     Label labelReturn = new Label();