diff --git a/lucene/expressions/ivy.xml b/lucene/expressions/ivy.xml
index 88bfd3296e6..e48e517a63a 100644
--- a/lucene/expressions/ivy.xml
+++ b/lucene/expressions/ivy.xml
@@ -21,6 +21,7 @@
+
diff --git a/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java b/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java
index feadee8adcc..fa874818466 100644
--- a/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java
+++ b/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java
@@ -43,6 +43,7 @@ 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;
@@ -131,16 +132,18 @@ public class JavascriptCompiler {
private static final String COMPILED_EXPRESSION_CLASS = JavascriptCompiler.class.getName() + "$CompiledExpression";
private static final String COMPILED_EXPRESSION_INTERNAL = COMPILED_EXPRESSION_CLASS.replace('.', '/');
- private static final String EXPRESSION_INTERNAL = Type.getInternalName(Expression.class);
-
+ private static final Type EXPRESSION_TYPE = Type.getType(Expression.class);
private static final Type FUNCTION_VALUES_TYPE = Type.getType(FunctionValues.class);
- private static final Type FUNCTION_VALUES_ARRAY_TYPE = Type.getType(FunctionValues[].class);
- private static final Type STRING_TYPE = Type.getType(String.class);
- private static final Type STRING_ARRAY_TYPE = Type.getType(String[].class);
+
+ private static final org.objectweb.asm.commons.Method
+ EXPRESSION_CTOR = getMethod("void (String, String[])"),
+ EVALUATE_METHOD = getMethod("double evaluate(int, " + FunctionValues.class.getName() + "[])"),
+ DOUBLE_VAL_METHOD = getMethod("double doubleVal(int)");
- private static final String CONSTRUCTOR_DESC = Type.getMethodDescriptor(Type.VOID_TYPE, STRING_TYPE, STRING_ARRAY_TYPE);
- private static final String EVALUATE_METHOD_DESC = Type.getMethodDescriptor(Type.DOUBLE_TYPE, Type.INT_TYPE, FUNCTION_VALUES_ARRAY_TYPE);
- private static final String DOUBLE_VAL_METHOD_DESC = Type.getMethodDescriptor(Type.DOUBLE_TYPE, Type.INT_TYPE);
+ // to work around import clash:
+ private static org.objectweb.asm.commons.Method getMethod(String method) {
+ return org.objectweb.asm.commons.Method.getMethod(method);
+ }
// This maximum length is theoretically 65535 bytes, but as its CESU-8 encoded we dont know how large it is in bytes, so be safe
// rcmuir: "If your ranking function is that large you need to check yourself into a mental institution!"
@@ -149,7 +152,7 @@ public class JavascriptCompiler {
private final String sourceText;
private final Map externalsMap = new LinkedHashMap();
private final ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
- private MethodVisitor methodVisitor;
+ private GeneratorAdapter methodVisitor;
private final Map functions;
@@ -242,22 +245,19 @@ public class JavascriptCompiler {
private void beginCompile() {
classWriter.visit(CLASSFILE_VERSION, ACC_PUBLIC | ACC_SUPER | ACC_FINAL | ACC_SYNTHETIC, COMPILED_EXPRESSION_INTERNAL,
- null, EXPRESSION_INTERNAL, null);
+ null, EXPRESSION_TYPE.getInternalName(), null);
String clippedSourceText = (sourceText.length() <= MAX_SOURCE_LENGTH) ? sourceText : (sourceText.substring(0, MAX_SOURCE_LENGTH - 3) + "...");
classWriter.visitSource(clippedSourceText, null);
- MethodVisitor constructor = classWriter.visitMethod(ACC_PUBLIC | ACC_SYNTHETIC, "", CONSTRUCTOR_DESC, null, null);
- constructor.visitCode();
- constructor.visitVarInsn(ALOAD, 0);
- constructor.visitVarInsn(ALOAD, 1);
- constructor.visitVarInsn(ALOAD, 2);
- constructor.visitMethodInsn(INVOKESPECIAL, EXPRESSION_INTERNAL, "", CONSTRUCTOR_DESC);
- constructor.visitInsn(RETURN);
- constructor.visitMaxs(0, 0);
- constructor.visitEnd();
+ GeneratorAdapter constructor = new GeneratorAdapter(ACC_PUBLIC | ACC_SYNTHETIC, EXPRESSION_CTOR, null, null, classWriter);
+ constructor.loadThis();
+ constructor.loadArg(0);
+ constructor.loadArg(1);
+ constructor.invokeConstructor(EXPRESSION_TYPE, EXPRESSION_CTOR);
+ constructor.returnValue();
+ constructor.endMethod();
- methodVisitor = classWriter.visitMethod(ACC_PUBLIC | ACC_SYNTHETIC, "evaluate", EVALUATE_METHOD_DESC, null, null);
- methodVisitor.visitCode();
+ methodVisitor = new GeneratorAdapter(ACC_PUBLIC | ACC_SYNTHETIC, EVALUATE_METHOD, null, null, classWriter);
}
private void recursiveCompile(Tree current, ComputedType expected) {
@@ -285,10 +285,8 @@ public class JavascriptCompiler {
recursiveCompile(current.getChild(argument), ComputedType.DOUBLE);
}
- String klass = Type.getInternalName(method.getDeclaringClass());
- String name = method.getName();
- String descriptor = Type.getMethodDescriptor(method);
- methodVisitor.visitMethodInsn(INVOKESTATIC, klass, name, descriptor);
+ methodVisitor.invokeStatic(Type.getType(method.getDeclaringClass()),
+ org.objectweb.asm.commons.Method.getMethod(method));
typeCompile(expected, ComputedType.DOUBLE);
break;
@@ -303,40 +301,10 @@ public class JavascriptCompiler {
}
methodVisitor.visitVarInsn(ALOAD, 2);
-
- switch (index) {
- case 0:
- methodVisitor.visitInsn(ICONST_0);
- break;
- case 1:
- methodVisitor.visitInsn(ICONST_1);
- break;
- case 2:
- methodVisitor.visitInsn(ICONST_2);
- break;
- case 3:
- methodVisitor.visitInsn(ICONST_3);
- break;
- case 4:
- methodVisitor.visitInsn(ICONST_4);
- break;
- case 5:
- methodVisitor.visitInsn(ICONST_5);
- break;
- default:
- if (index < 128) {
- methodVisitor.visitIntInsn(BIPUSH, index);
- } else if (index < 16384) {
- methodVisitor.visitIntInsn(SIPUSH, index);
- } else {
- methodVisitor.visitLdcInsn(index);
- }
- break;
- }
-
+ methodVisitor.push(index);
methodVisitor.visitInsn(AALOAD);
methodVisitor.visitVarInsn(ILOAD, 1);
- methodVisitor.visitMethodInsn(INVOKEVIRTUAL, FUNCTION_VALUES_TYPE.getInternalName(), "doubleVal", DOUBLE_VAL_METHOD_DESC);
+ methodVisitor.invokeVirtual(FUNCTION_VALUES_TYPE, DOUBLE_VAL_METHOD);
typeCompile(expected, ComputedType.DOUBLE);
break;
@@ -650,9 +618,8 @@ public class JavascriptCompiler {
}
private void endCompile() {
- methodVisitor.visitInsn(DRETURN);
- methodVisitor.visitMaxs(0, 0);
- methodVisitor.visitEnd();
+ methodVisitor.returnValue();
+ methodVisitor.endMethod();
classWriter.visitEnd();
}