Merge pull request #18263 from jdconrad/mapfix

Fix bracket shortcuts
This commit is contained in:
Jack Conradson 2016-05-10 23:18:44 -07:00
commit 30b5b4fc83
4 changed files with 33 additions and 41 deletions

View File

@ -102,7 +102,7 @@ class Analyzer extends PainlessParserBaseVisitor<Void> {
metadata.scorerValueSlot = utility.addVariable(null, "#scorer", definition.objectType).slot;
// doc parameter passed to the script.
// TODO: currently working as a def type, should be smapType...
metadata.docValueSlot = utility.addVariable(null, "doc", definition.defType).slot;
metadata.docValueSlot = utility.addVariable(null, "doc", definition.smapType).slot;
//
// reserved words implemented as local variables
//

View File

@ -238,14 +238,6 @@ class AnalyzerExternal {
definition.getType(parentemd.current.struct, parentemd.current.type.getDimensions() - 1);
analyzeLoadStoreExternal(ctx);
parentemd.current = braceenmd.type;
if (dotctx != null) {
metadata.createExtNodeMetadata(parent, dotctx);
analyzer.visit(dotctx);
} else if (bracectx != null) {
metadata.createExtNodeMetadata(parent, bracectx);
analyzer.visit(bracectx);
}
} else {
final boolean store = braceenmd.last && parentemd.storeExpr != null;
final boolean get = parentemd.read || parentemd.token > 0 || !braceenmd.last;
@ -319,6 +311,14 @@ class AnalyzerExternal {
throw new IllegalArgumentException(AnalyzerUtility.error(ctx) +
"Attempting to address a non-array type [" + parentemd.current.name + "] as an array.");
}
if (dotctx != null) {
metadata.createExtNodeMetadata(parent, dotctx);
analyzer.visit(dotctx);
} else if (bracectx != null) {
metadata.createExtNodeMetadata(parent, bracectx);
analyzer.visit(bracectx);
}
}
void processExtdot(final ExtdotContext ctx) {
@ -449,7 +449,7 @@ class AnalyzerExternal {
}
// special cases: reserved words
if ("_score".equals(id) || "doc".equals(id)) {
if (varenmd.last && ("_score".equals(id) || "doc".equals(id))) {
// read-only: don't allow stores
if (parentemd.storeExpr != null) {
throw new IllegalArgumentException(AnalyzerUtility.error(ctx) + "Variable [" + id + "] is read-only.");

View File

@ -306,18 +306,14 @@ class WriterExternal {
final boolean cat = utility.containsStrings(parentemd.storeExpr);
if (cat) {
if (field || name || shortcut) {
execute.dupX1();
} else if (array) {
execute.dup2X1();
if (maplist && constant != null) {
utility.writeConstant(source, constant);
}
if (maplist) {
if (constant != null) {
utility.writeConstant(source, constant);
}
execute.dupX2();
if (field || name || (shortcut && !maplist)) {
execute.dupX1();
} else if (array || maplist) {
execute.dup2X1();
}
writeLoadStoreInstruction(source, false, variable, field, name, array, shortcut);
@ -340,18 +336,14 @@ class WriterExternal {
} else if (parentemd.token > 0) {
final int token = parentemd.token;
if (field || name || shortcut) {
execute.dup();
} else if (array) {
execute.dup2();
if (maplist && constant != null) {
utility.writeConstant(source, constant);
}
if (maplist) {
if (constant != null) {
utility.writeConstant(source, constant);
}
execute.dupX1();
if (field || name || (shortcut && !maplist)) {
execute.dup();
} else if (array || maplist) {
execute.dup2();
}
writeLoadStoreInstruction(source, false, variable, field, name, array, shortcut);
@ -467,10 +459,10 @@ class WriterExternal {
private void writeLoadStoreField(final ParserRuleContext source, final boolean store, final String name) {
if (store) {
execute.visitInvokeDynamicInsn(name, WriterConstants.DEF_DYNAMIC_STORE_FIELD_DESC,
execute.visitInvokeDynamicInsn(name, WriterConstants.DEF_DYNAMIC_STORE_FIELD_DESC,
WriterConstants.DEF_BOOTSTRAP_HANDLE, new Object[] { DynamicCallSite.STORE });
} else {
execute.visitInvokeDynamicInsn(name, WriterConstants.DEF_DYNAMIC_LOAD_FIELD_DESC,
execute.visitInvokeDynamicInsn(name, WriterConstants.DEF_DYNAMIC_LOAD_FIELD_DESC,
WriterConstants.DEF_BOOTSTRAP_HANDLE, new Object[] { DynamicCallSite.LOAD });
}
}
@ -482,10 +474,10 @@ class WriterExternal {
if (type.sort == Sort.DEF) {
if (store) {
execute.visitInvokeDynamicInsn("arrayStore", WriterConstants.DEF_DYNAMIC_ARRAY_STORE_DESC,
execute.visitInvokeDynamicInsn("arrayStore", WriterConstants.DEF_DYNAMIC_ARRAY_STORE_DESC,
WriterConstants.DEF_BOOTSTRAP_HANDLE, new Object[] { DynamicCallSite.ARRAY_STORE });
} else {
execute.visitInvokeDynamicInsn("arrayLoad", WriterConstants.DEF_DYNAMIC_ARRAY_LOAD_DESC,
execute.visitInvokeDynamicInsn("arrayLoad", WriterConstants.DEF_DYNAMIC_ARRAY_LOAD_DESC,
WriterConstants.DEF_BOOTSTRAP_HANDLE, new Object[] { DynamicCallSite.ARRAY_LOAD });
}
} else {
@ -705,11 +697,11 @@ class WriterExternal {
writeDynamicCallExternal(source);
}
}
private void writeDynamicCallExternal(final ExtcallContext source) {
final ExtNodeMetadata sourceenmd = metadata.getExtNodeMetadata(source);
final List<ExpressionContext> arguments = source.arguments().expression();
StringBuilder signature = new StringBuilder();
signature.append('(');
// first parameter is the receiver, we never know its type: always Object
@ -726,7 +718,7 @@ class WriterExternal {
signature.append(')');
// return value: currently always Object. making this better may be tricky...
signature.append(WriterConstants.OBJECT_TYPE.getDescriptor());
execute.visitInvokeDynamicInsn((String)sourceenmd.target, signature.toString(),
execute.visitInvokeDynamicInsn((String)sourceenmd.target, signature.toString(),
WriterConstants.DEF_BOOTSTRAP_HANDLE, new Object[] { DynamicCallSite.METHOD_CALL });
}
}

View File

@ -42,22 +42,22 @@ public class NeedsScoreTests extends ESSingleNodeTestCase {
SearchLookup lookup = new SearchLookup(index.mapperService(), index.fieldData(), null);
Object compiled = service.compile("1.2", Collections.emptyMap());
SearchScript ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled),
SearchScript ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled),
lookup, Collections.<String, Object>emptyMap());
assertFalse(ss.needsScores());
compiled = service.compile("doc['d'].value", Collections.emptyMap());
ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled),
ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled),
lookup, Collections.<String, Object>emptyMap());
assertFalse(ss.needsScores());
compiled = service.compile("1/_score", Collections.emptyMap());
ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled),
ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled),
lookup, Collections.<String, Object>emptyMap());
assertTrue(ss.needsScores());
compiled = service.compile("doc['d'].value * _score", Collections.emptyMap());
ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled),
ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled),
lookup, Collections.<String, Object>emptyMap());
assertTrue(ss.needsScores());
}