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 13:22:42 UTC
svn commit: r1522873 -
/lucene/dev/branches/lucene5207/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java
Author: uschindler
Date: Fri Sep 13 11:22:42 2013
New Revision: 1522873
URL: http://svn.apache.org/r1522873
Log:
LUCENE-5207: Create the class name of generated classes from the parsed text
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=1522873&r1=1522872&r2=1522873&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 11:22:42 2013
@@ -116,8 +116,7 @@ public class JavascriptCompiler {
}
}
- private static final String EXPRESSION_CLASS_PREFIX = JavascriptCompiler.class.getPackage().getName() + ".Computed_";
- private static final String EXPRESSION_INTERNAL_PREFIX = EXPRESSION_CLASS_PREFIX.replace('.', '/');
+ private static final String EXPRESSION_CLASS_PREFIX = JavascriptCompiler.class.getPackage().getName() + ".Expr_";
private static final String COMPILED_EXPRESSION_INTERNAL = Type.getInternalName(Expression.class);
private static final Type FUNCTION_VALUES_TYPE = Type.getType(FunctionValues.class);
@@ -131,7 +130,6 @@ public class JavascriptCompiler {
private final Loader loader = new Loader(getClass().getClassLoader());
- private String className;
private ClassWriter classWriter;
private MethodVisitor methodVisitor;
private Map<String, Integer> externalsMap;
@@ -165,28 +163,52 @@ public class JavascriptCompiler {
if (sourceText == null) {
throw new NullPointerException();
}
+ final String className = EXPRESSION_CLASS_PREFIX + createClassName(sourceText);
+ // System.out.println(sourceText + "|" + className);
try {
- this.className = "CompiledExpression";
externalsMap = new HashMap<String, Integer>();
externalsList = new ArrayList<String>();
Tree antlrTree = getAntlrComputedExpressionTree(sourceText);
- beginCompile();
+ beginCompile(className);
recursiveCompile(antlrTree, ComputedType.DOUBLE);
endCompile();
- Class<? extends Expression> evaluatorClass = loader.define(EXPRESSION_CLASS_PREFIX + className, classWriter.toByteArray());
+ Class<? extends Expression> evaluatorClass = loader.define(className, classWriter.toByteArray());
Constructor<? extends Expression> constructor = evaluatorClass.getConstructor(String.class, String[].class);
return constructor.newInstance(sourceText, externalsList.toArray(new String[externalsList.size()]));
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException exception) {
throw new IllegalStateException("An internal error occurred attempting to compile the expression (" + className + ").", exception);
}
}
+
+ private String createClassName(String sourceText) {
+ final StringBuilder sb = new StringBuilder(sourceText.length() / 2);
+ boolean wasIdentifierPart = true;
+ for (int i = 0, c = sourceText.length(); i < c; i++) {
+ final char ch = sourceText.charAt(i);
+ if (Character.isJavaIdentifierPart(ch)) {
+ sb.append(ch);
+ wasIdentifierPart = true;
+ } else if (wasIdentifierPart) {
+ sb.append('_');
+ wasIdentifierPart = false;
+ }
+ }
+ for (int i = sb.length() - 1; i >= 0; i--) {
+ if (sb.charAt(i) == '_') {
+ sb.setLength(i);
+ } else {
+ break;
+ }
+ }
+ return sb.toString();
+ }
- private void beginCompile() {
+ private void beginCompile(String className) {
classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
- classWriter.visit(V1_7, ACC_PUBLIC + ACC_SUPER + ACC_FINAL, EXPRESSION_INTERNAL_PREFIX + className,
+ classWriter.visit(V1_7, ACC_PUBLIC + ACC_SUPER + ACC_FINAL, className.replace('.', '/'),
null, COMPILED_EXPRESSION_INTERNAL, null);
MethodVisitor constructor = classWriter.visitMethod(ACC_PUBLIC, "<init>", CONSTRUCTOR_DESC, null, null);
constructor.visitCode();