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 02:48:44 UTC
svn commit: r1523375 -
/lucene/dev/branches/lucene5207/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java
Author: uschindler
Date: Sun Sep 15 00:48:44 2013
New Revision: 1523375
URL: http://svn.apache.org/r1523375
Log:
LUCENE-5207: Simplify the comparisons
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=1523375&r1=1523374&r2=1523375&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 00:48:44 2013
@@ -21,18 +21,11 @@ import static org.objectweb.asm.Opcodes.
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.LAND;
import static org.objectweb.asm.Opcodes.LOR;
@@ -274,7 +267,6 @@ public class JavascriptCompiler {
gen.arrayLoad(FUNCTION_VALUES_TYPE);
gen.loadArg(0);
gen.invokeVirtual(FUNCTION_VALUES_TYPE, DOUBLE_VAL_METHOD);
-
gen.cast(Type.DOUBLE_TYPE, expected);
break;
case JavascriptParser.HEX:
@@ -360,98 +352,27 @@ public class JavascriptCompiler {
break;
case JavascriptParser.AT_BIT_NOT:
recursiveCompile(current.getChild(0), Type.LONG_TYPE);
- gen.visitLdcInsn(new Long(-1));
+ gen.push(-1L);
gen.visitInsn(LXOR);
gen.cast(Type.LONG_TYPE, expected);
break;
case JavascriptParser.AT_COMP_EQ:
- Label labelEqTrue = new Label();
- Label labelEqReturn = new Label();
- recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
- recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
- gen.visitInsn(DCMPL);
-
- gen.visitJumpInsn(IFEQ, labelEqTrue);
- pushBoolean(expected, false);
- gen.visitJumpInsn(GOTO, labelEqReturn);
- gen.visitLabel(labelEqTrue);
- pushBoolean(expected, true);
- gen.visitLabel(labelEqReturn);
+ compileCompare(GeneratorAdapter.EQ, current, expected);
break;
case JavascriptParser.AT_COMP_NEQ:
- Label labelNeqTrue = new Label();
- Label labelNeqReturn = new Label();
-
- recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
- recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
- gen.visitInsn(DCMPL);
-
- gen.visitJumpInsn(IFNE, labelNeqTrue);
- pushBoolean(expected, false);
- gen.visitJumpInsn(GOTO, labelNeqReturn);
- gen.visitLabel(labelNeqTrue);
- pushBoolean(expected, true);
- gen.visitLabel(labelNeqReturn);
+ compileCompare(GeneratorAdapter.NE, current, expected);
break;
case JavascriptParser.AT_COMP_LT:
- Label labelLtTrue = new Label();
- Label labelLtReturn = new Label();
-
- recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
- recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
- gen.visitInsn(DCMPG);
-
- gen.visitJumpInsn(IFLT, labelLtTrue);
- pushBoolean(expected, false);
- gen.visitJumpInsn(GOTO, labelLtReturn);
- gen.visitLabel(labelLtTrue);
- pushBoolean(expected, true);
- gen.visitLabel(labelLtReturn);
+ compileCompare(GeneratorAdapter.LT, current, expected);
break;
case JavascriptParser.AT_COMP_GT:
- Label labelGtTrue = new Label();
- Label labelGtReturn = new Label();
-
- recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
- recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
- gen.visitInsn(DCMPL);
-
- gen.visitJumpInsn(IFGT, labelGtTrue);
- pushBoolean(expected, false);
- gen.visitJumpInsn(GOTO, labelGtReturn);
- gen.visitLabel(labelGtTrue);
- pushBoolean(expected, true);
- gen.visitLabel(labelGtReturn);
+ compileCompare(GeneratorAdapter.GT, current, expected);
break;
case JavascriptParser.AT_COMP_LTE:
- Label labelLteTrue = new Label();
- Label labelLteReturn = new Label();
-
- recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
- recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
- gen.visitInsn(DCMPG);
-
- gen.visitJumpInsn(IFLE, labelLteTrue);
- pushBoolean(expected, false);
- gen.visitJumpInsn(GOTO, labelLteReturn);
- gen.visitLabel(labelLteTrue);
- pushBoolean(expected, true);
- gen.visitLabel(labelLteReturn);
+ compileCompare(GeneratorAdapter.LE, current, expected);
break;
case JavascriptParser.AT_COMP_GTE:
- Label labelGteTrue = new Label();
- Label labelGteReturn = new Label();
-
- recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
- recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
- gen.visitInsn(DCMPL);
-
- gen.visitJumpInsn(IFGE, labelGteTrue);
- pushBoolean(expected, false);
- gen.visitJumpInsn(GOTO, labelGteReturn);
- gen.visitLabel(labelGteTrue);
- pushBoolean(expected, true);
- gen.visitLabel(labelGteReturn);
+ compileCompare(GeneratorAdapter.GE, current, expected);
break;
case JavascriptParser.AT_BOOL_NOT:
Label labelNotTrue = new Label();
@@ -460,7 +381,7 @@ public class JavascriptCompiler {
recursiveCompile(current.getChild(0), Type.INT_TYPE);
gen.visitJumpInsn(IFEQ, labelNotTrue);
pushBoolean(expected, false);
- gen.visitJumpInsn(GOTO, labelNotReturn);
+ gen.goTo(labelNotReturn);
gen.visitLabel(labelNotTrue);
pushBoolean(expected, true);
gen.visitLabel(labelNotReturn);
@@ -474,7 +395,7 @@ public class JavascriptCompiler {
recursiveCompile(current.getChild(1), Type.INT_TYPE);
gen.visitJumpInsn(IFEQ, andFalse);
pushBoolean(expected, true);
- gen.visitJumpInsn(GOTO, andEnd);
+ gen.goTo(andEnd);
gen.visitLabel(andFalse);
pushBoolean(expected, false);
gen.visitLabel(andEnd);
@@ -488,7 +409,7 @@ public class JavascriptCompiler {
recursiveCompile(current.getChild(1), Type.INT_TYPE);
gen.visitJumpInsn(IFNE, orTrue);
pushBoolean(expected, false);
- gen.visitJumpInsn(GOTO, orEnd);
+ gen.goTo(orEnd);
gen.visitLabel(orTrue);
pushBoolean(expected, true);
gen.visitLabel(orEnd);
@@ -500,7 +421,7 @@ public class JavascriptCompiler {
recursiveCompile(current.getChild(0), Type.INT_TYPE);
gen.visitJumpInsn(IFEQ, condFalse);
recursiveCompile(current.getChild(1), expected);
- gen.visitJumpInsn(GOTO, condEnd);
+ gen.goTo(condEnd);
gen.visitLabel(condFalse);
recursiveCompile(current.getChild(2), expected);
gen.visitLabel(condEnd);
@@ -510,6 +431,21 @@ public class JavascriptCompiler {
}
}
+ private void compileCompare(int operator, Tree current, Type expected) {
+ Label labelTrue = new Label();
+ Label labelReturn = new Label();
+
+ recursiveCompile(current.getChild(0), Type.DOUBLE_TYPE);
+ recursiveCompile(current.getChild(1), Type.DOUBLE_TYPE);
+
+ gen.ifCmp(Type.DOUBLE_TYPE, operator, labelTrue);
+ pushBoolean(expected, false);
+ gen.goTo(labelReturn);
+ gen.visitLabel(labelTrue);
+ pushBoolean(expected, true);
+ gen.visitLabel(labelReturn);
+ }
+
private void pushBoolean(Type expected, boolean truth) {
switch (expected.getSort()) {
case Type.INT: