489 return vmIntrinsics::_invokeGeneric; |
489 return vmIntrinsics::_invokeGeneric; |
490 } |
490 } |
491 return vmIntrinsics::_none; |
491 return vmIntrinsics::_none; |
492 } |
492 } |
493 |
493 |
|
494 // Returns true if method is signature polymorphic and public |
|
495 bool MethodHandles::is_signature_polymorphic_public_name(Klass* klass, Symbol* name) { |
|
496 if (is_signature_polymorphic_name(klass, name)) { |
|
497 InstanceKlass* iklass = InstanceKlass::cast(klass); |
|
498 int me; |
|
499 int ms = iklass->find_method_by_name(name, &me); |
|
500 assert(ms != -1, ""); |
|
501 for (; ms < me; ms++) { |
|
502 Method* m = iklass->methods()->at(ms); |
|
503 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS | JVM_ACC_PUBLIC; |
|
504 int flags = m->access_flags().as_int(); |
|
505 if ((flags & required) == required && ArgumentCount(m->signature()).size() == 1) { |
|
506 return true; |
|
507 } |
|
508 } |
|
509 } |
|
510 return false; |
|
511 } |
494 |
512 |
495 // convert the external string or reflective type to an internal signature |
513 // convert the external string or reflective type to an internal signature |
496 Symbol* MethodHandles::lookup_signature(oop type_str, bool intern_if_not_found, TRAPS) { |
514 Symbol* MethodHandles::lookup_signature(oop type_str, bool intern_if_not_found, TRAPS) { |
497 if (java_lang_invoke_MethodType::is_instance(type_str)) { |
515 if (java_lang_invoke_MethodType::is_instance(type_str)) { |
498 return java_lang_invoke_MethodType::as_signature(type_str, intern_if_not_found, THREAD); |
516 return java_lang_invoke_MethodType::as_signature(type_str, intern_if_not_found, THREAD); |
739 if (name == vmSymbols::class_initializer_name()) |
757 if (name == vmSymbols::class_initializer_name()) |
740 return empty; // illegal name |
758 return empty; // illegal name |
741 |
759 |
742 vmIntrinsics::ID mh_invoke_id = vmIntrinsics::_none; |
760 vmIntrinsics::ID mh_invoke_id = vmIntrinsics::_none; |
743 if ((flags & ALL_KINDS) == IS_METHOD && |
761 if ((flags & ALL_KINDS) == IS_METHOD && |
744 (defc == SystemDictionary::MethodHandle_klass()) && |
762 (defc == SystemDictionary::MethodHandle_klass() || defc == SystemDictionary::VarHandle_klass()) && |
745 (ref_kind == JVM_REF_invokeVirtual || |
763 (ref_kind == JVM_REF_invokeVirtual || |
746 ref_kind == JVM_REF_invokeSpecial || |
764 ref_kind == JVM_REF_invokeSpecial || |
747 // static invocation mode is required for _linkToVirtual, etc.: |
765 // static invocation mode is required for _linkToVirtual, etc.: |
748 ref_kind == JVM_REF_invokeStatic)) { |
766 ref_kind == JVM_REF_invokeStatic)) { |
749 vmIntrinsics::ID iid = signature_polymorphic_name_id(name); |
767 vmIntrinsics::ID iid = signature_polymorphic_name_id(name); |