src/hotspot/share/prims/methodHandles.cpp
changeset 50771 9ca95539747d
parent 50735 2f2af62dfac7
child 51329 9c68699bebe5
equal deleted inserted replaced
50770:c545db4fc9bd 50771:9ca95539747d
   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);