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/13 17:22:41 UTC
svn commit: r1522972 -
/lucene/dev/branches/lucene5207/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java
Author: uschindler
Date: Fri Sep 13 15:22:41 2013
New Revision: 1522972
URL: http://svn.apache.org/r1522972
Log:
LUCENE-5207: Refactor compiler to use final fields and simplify initialization
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=1522972&r1=1522971&r2=1522972&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 Fri Sep 13 15:22:41 2013
@@ -20,7 +20,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -136,10 +136,10 @@ public class JavascriptCompiler {
private static final int MAX_SOURCE_LENGTH = 16384;
- private ClassWriter classWriter;
+ private final String sourceText;
+ private final Map<String, Integer> externalsMap = new LinkedHashMap<String, Integer>();
+ private final ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
private MethodVisitor methodVisitor;
- private Map<String, Integer> externalsMap;
- private List<String> externalsList;
/**
* Compiles the given expression.
@@ -149,7 +149,7 @@ public class JavascriptCompiler {
* @throws ParseException on failure to compile
*/
public static Expression compile(String sourceText) throws ParseException {
- return new JavascriptCompiler().compileExpression(sourceText);
+ return new JavascriptCompiler(sourceText).compileExpression();
}
/**
@@ -166,7 +166,11 @@ public class JavascriptCompiler {
/**
* Constructs a compiler for expressions.
*/
- private JavascriptCompiler() {
+ private JavascriptCompiler(String sourceText) {
+ if (sourceText == null) {
+ throw new NullPointerException();
+ }
+ this.sourceText = sourceText;
}
/**
@@ -176,31 +180,24 @@ public class JavascriptCompiler {
* @return A new compiled expression
* @throws ParseException on failure to compile
*/
- private Expression compileExpression(String sourceText) throws ParseException {
- if (sourceText == null) {
- throw new NullPointerException();
- }
+ private Expression compileExpression() throws ParseException {
try {
- externalsMap = new HashMap<String, Integer>();
- externalsList = new ArrayList<String>();
-
- Tree antlrTree = getAntlrComputedExpressionTree(sourceText);
+ Tree antlrTree = getAntlrComputedExpressionTree();
- beginCompile(sourceText);
+ beginCompile();
recursiveCompile(antlrTree, ComputedType.DOUBLE);
endCompile();
Class<? extends Expression> evaluatorClass = new Loader(getClass().getClassLoader())
.define(COMPILED_EXPRESSION_CLASS, classWriter.toByteArray());
Constructor<? extends Expression> constructor = evaluatorClass.getConstructor(String.class, String[].class);
- return constructor.newInstance(sourceText, externalsList.toArray(new String[externalsList.size()]));
+ return constructor.newInstance(sourceText, externalsMap.keySet().toArray(new String[externalsMap.size()]));
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException exception) {
throw new IllegalStateException("An internal error occurred attempting to compile the expression (" + sourceText + ").", exception);
}
}
- private void beginCompile(String sourceText) {
- classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
+ private void beginCompile() {
classWriter.visit(CLASSFILE_VERSION, ACC_PUBLIC + ACC_SUPER + ACC_FINAL, COMPILED_EXPRESSION_INTERNAL,
null, EXPRESSION_INTERNAL, null);
String clippedSourceText = (sourceText.length() <= MAX_SOURCE_LENGTH) ? sourceText : (sourceText.substring(0, MAX_SOURCE_LENGTH - 3) + "...");
@@ -246,8 +243,7 @@ public class JavascriptCompiler {
if (externalsMap.containsKey(text)) {
index = externalsMap.get(text);
} else {
- index = externalsList.size();
- externalsList.add(text);
+ index = externalsMap.size();
externalsMap.put(text, index);
}
@@ -625,8 +621,8 @@ public class JavascriptCompiler {
classWriter.visitEnd();
}
- private static Tree getAntlrComputedExpressionTree(String expression) throws ParseException {
- CharStream input = new ANTLRStringStream(expression);
+ private Tree getAntlrComputedExpressionTree() throws ParseException {
+ CharStream input = new ANTLRStringStream(sourceText);
JavascriptLexer lexer = new JavascriptLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavascriptParser parser = new JavascriptParser(tokens);