mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-24 17:09:48 +00:00
painless: use better typing for dynamic method calls
This commit is contained in:
parent
ba2fe156e8
commit
3aeb66885b
@ -20,6 +20,7 @@
|
|||||||
package org.elasticsearch.painless;
|
package org.elasticsearch.painless;
|
||||||
|
|
||||||
import org.antlr.v4.runtime.ParserRuleContext;
|
import org.antlr.v4.runtime.ParserRuleContext;
|
||||||
|
import org.elasticsearch.painless.Definition.Cast;
|
||||||
import org.elasticsearch.painless.Definition.Constructor;
|
import org.elasticsearch.painless.Definition.Constructor;
|
||||||
import org.elasticsearch.painless.Definition.Field;
|
import org.elasticsearch.painless.Definition.Field;
|
||||||
import org.elasticsearch.painless.Definition.Method;
|
import org.elasticsearch.painless.Definition.Method;
|
||||||
@ -714,14 +715,16 @@ class WriterExternal {
|
|||||||
// first parameter is the receiver, we never know its type: always Object
|
// first parameter is the receiver, we never know its type: always Object
|
||||||
signature.append(WriterConstants.OBJECT_TYPE.getDescriptor());
|
signature.append(WriterConstants.OBJECT_TYPE.getDescriptor());
|
||||||
|
|
||||||
// TODO: remove our explicit conversions and feed more type information for args/return value,
|
|
||||||
// it can avoid some unnecessary boxing etc.
|
|
||||||
for (int i = 0; i < arguments.size(); i++) {
|
for (int i = 0; i < arguments.size(); i++) {
|
||||||
signature.append(WriterConstants.OBJECT_TYPE.getDescriptor());
|
ExpressionMetadata arg = metadata.getExpressionMetadata(arguments.get(i));
|
||||||
|
// disable any implicit casts/conversion for arguments, let invokeDynamic take care
|
||||||
|
arg.to = arg.from;
|
||||||
|
arg.cast = new Cast(arg.from, arg.from);
|
||||||
|
signature.append(arg.from.type.getDescriptor());
|
||||||
writer.visit(arguments.get(i));
|
writer.visit(arguments.get(i));
|
||||||
}
|
}
|
||||||
signature.append(')');
|
signature.append(')');
|
||||||
// return value
|
// return value: currently always Object. making this better may be tricky...
|
||||||
signature.append(WriterConstants.OBJECT_TYPE.getDescriptor());
|
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 });
|
WriterConstants.DEF_BOOTSTRAP_HANDLE, new Object[] { DynamicCallSite.METHOD_CALL });
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package org.elasticsearch.painless;
|
package org.elasticsearch.painless;
|
||||||
|
|
||||||
|
import java.lang.invoke.WrongMethodTypeException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
@ -140,7 +141,7 @@ public class WhenThingsGoWrongTests extends ScriptTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testDynamicWrongArgs() {
|
public void testDynamicWrongArgs() {
|
||||||
expectThrows(ClassCastException.class, () -> {
|
expectThrows(WrongMethodTypeException.class, () -> {
|
||||||
exec("def x = new ArrayList(); return x.get('bogus');");
|
exec("def x = new ArrayList(); return x.get('bogus');");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user