--- a/src/hotspot/share/prims/methodHandles.cpp Mon Jun 25 14:36:16 2018 -0700
+++ b/src/hotspot/share/prims/methodHandles.cpp Mon Jun 25 14:39:44 2018 -0700
@@ -491,6 +491,24 @@
return vmIntrinsics::_none;
}
+// Returns true if method is signature polymorphic and public
+bool MethodHandles::is_signature_polymorphic_public_name(Klass* klass, Symbol* name) {
+ if (is_signature_polymorphic_name(klass, name)) {
+ InstanceKlass* iklass = InstanceKlass::cast(klass);
+ int me;
+ int ms = iklass->find_method_by_name(name, &me);
+ assert(ms != -1, "");
+ for (; ms < me; ms++) {
+ Method* m = iklass->methods()->at(ms);
+ int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS | JVM_ACC_PUBLIC;
+ int flags = m->access_flags().as_int();
+ if ((flags & required) == required && ArgumentCount(m->signature()).size() == 1) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
// convert the external string or reflective type to an internal signature
Symbol* MethodHandles::lookup_signature(oop type_str, bool intern_if_not_found, TRAPS) {
@@ -741,7 +759,7 @@
vmIntrinsics::ID mh_invoke_id = vmIntrinsics::_none;
if ((flags & ALL_KINDS) == IS_METHOD &&
- (defc == SystemDictionary::MethodHandle_klass()) &&
+ (defc == SystemDictionary::MethodHandle_klass() || defc == SystemDictionary::VarHandle_klass()) &&
(ref_kind == JVM_REF_invokeVirtual ||
ref_kind == JVM_REF_invokeSpecial ||
// static invocation mode is required for _linkToVirtual, etc.: