hotspot/src/share/vm/prims/methodHandles.cpp
changeset 5421 e294db54fc0d
parent 5420 586d3988e72b
child 5547 f4b087cbb361
equal deleted inserted replaced
5420:586d3988e72b 5421:e294db54fc0d
   473   // convert the external string name to an internal symbol
   473   // convert the external string name to an internal symbol
   474   symbolHandle name(THREAD, java_lang_String::as_symbol_or_null(name_str));
   474   symbolHandle name(THREAD, java_lang_String::as_symbol_or_null(name_str));
   475   if (name.is_null())  return;  // no such name
   475   if (name.is_null())  return;  // no such name
   476   name_str = NULL;  // safety
   476   name_str = NULL;  // safety
   477 
   477 
       
   478   Handle polymorphic_method_type;
       
   479   bool polymorphic_signature = false;
       
   480   if ((flags & ALL_KINDS) == IS_METHOD &&
       
   481       (defc() == SystemDictionary::InvokeDynamic_klass() ||
       
   482        (defc() == SystemDictionary::MethodHandle_klass() &&
       
   483         methodOopDesc::is_method_handle_invoke_name(name()))))
       
   484     polymorphic_signature = true;
       
   485 
   478   // convert the external string or reflective type to an internal signature
   486   // convert the external string or reflective type to an internal signature
   479   bool force_signature = methodOopDesc::is_method_handle_invoke_name(name());
       
   480   symbolHandle type; {
   487   symbolHandle type; {
   481     symbolOop type_sym = NULL;
   488     symbolOop type_sym = NULL;
   482     if (java_dyn_MethodType::is_instance(type_str)) {
   489     if (java_dyn_MethodType::is_instance(type_str)) {
   483       type_sym = java_dyn_MethodType::as_signature(type_str, force_signature, CHECK);
   490       type_sym = java_dyn_MethodType::as_signature(type_str, polymorphic_signature, CHECK);
       
   491       if (polymorphic_signature)
       
   492         polymorphic_method_type = Handle(THREAD, type_str);  //preserve exactly
   484     } else if (java_lang_Class::is_instance(type_str)) {
   493     } else if (java_lang_Class::is_instance(type_str)) {
   485       type_sym = java_lang_Class::as_signature(type_str, force_signature, CHECK);
   494       type_sym = java_lang_Class::as_signature(type_str, false, CHECK);
   486     } else if (java_lang_String::is_instance(type_str)) {
   495     } else if (java_lang_String::is_instance(type_str)) {
   487       if (force_signature) {
   496       if (polymorphic_signature) {
   488         type     = java_lang_String::as_symbol(type_str, CHECK);
   497         type     = java_lang_String::as_symbol(type_str, CHECK);
   489       } else {
   498       } else {
   490         type_sym = java_lang_String::as_symbol_or_null(type_str);
   499         type_sym = java_lang_String::as_symbol_or_null(type_str);
   491       }
   500       }
   492     } else {
   501     } else {
   515           LinkResolver::resolve_virtual_call(result, Handle(), defc,
   524           LinkResolver::resolve_virtual_call(result, Handle(), defc,
   516                         defc, name, type, KlassHandle(), false, false, THREAD);
   525                         defc, name, type, KlassHandle(), false, false, THREAD);
   517         }
   526         }
   518         if (HAS_PENDING_EXCEPTION) {
   527         if (HAS_PENDING_EXCEPTION) {
   519           CLEAR_PENDING_EXCEPTION;
   528           CLEAR_PENDING_EXCEPTION;
   520           return;
   529           break;  // go to second chance
   521         }
   530         }
   522       }
   531       }
   523       methodHandle m = result.resolved_method();
   532       methodHandle m = result.resolved_method();
   524       oop vmtarget = NULL;
   533       oop vmtarget = NULL;
   525       int vmindex = methodOopDesc::nonvirtual_vtable_index;
   534       int vmindex = methodOopDesc::nonvirtual_vtable_index;
   589       sun_dyn_MemberName::set_vmtarget(mname(),  vmtarget);
   598       sun_dyn_MemberName::set_vmtarget(mname(),  vmtarget);
   590       sun_dyn_MemberName::set_vmindex(mname(),   vmindex);
   599       sun_dyn_MemberName::set_vmindex(mname(),   vmindex);
   591       sun_dyn_MemberName::set_modifiers(mname(), mods);
   600       sun_dyn_MemberName::set_modifiers(mname(), mods);
   592       return;
   601       return;
   593     }
   602     }
   594   }
   603   default:
   595   THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format");
   604     THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format");
       
   605   }
       
   606 
       
   607   // Second chance.
       
   608   if (polymorphic_method_type.not_null()) {
       
   609     // Look on a non-null class loader.
       
   610     Handle cur_class_loader;
       
   611     const int nptypes = java_dyn_MethodType::ptype_count(polymorphic_method_type());
       
   612     for (int i = 0; i <= nptypes; i++) {
       
   613       oop type_mirror;
       
   614       if (i < nptypes)  type_mirror = java_dyn_MethodType::ptype(polymorphic_method_type(), i);
       
   615       else              type_mirror = java_dyn_MethodType::rtype(polymorphic_method_type());
       
   616       klassOop example_type = java_lang_Class::as_klassOop(type_mirror);
       
   617       if (example_type == NULL)  continue;
       
   618       oop class_loader = Klass::cast(example_type)->class_loader();
       
   619       if (class_loader == NULL || class_loader == cur_class_loader())  continue;
       
   620       cur_class_loader = Handle(THREAD, class_loader);
       
   621       methodOop m = SystemDictionary::find_method_handle_invoke(name,
       
   622                                                                 type,
       
   623                                                                 KlassHandle(THREAD, example_type),
       
   624                                                                 THREAD);
       
   625       if (HAS_PENDING_EXCEPTION) {
       
   626         CLEAR_PENDING_EXCEPTION;
       
   627         m = NULL;
       
   628         // try again with a different class loader...
       
   629       }
       
   630       if (m != NULL) {
       
   631         int mods = (m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS);
       
   632         sun_dyn_MemberName::set_vmtarget(mname(),  m);
       
   633         sun_dyn_MemberName::set_vmindex(mname(),   m->vtable_index());
       
   634         sun_dyn_MemberName::set_modifiers(mname(), mods);
       
   635         return;
       
   636       }
       
   637     }
       
   638   }
   596 }
   639 }
   597 
   640 
   598 // Conversely, a member name which is only initialized from JVM internals
   641 // Conversely, a member name which is only initialized from JVM internals
   599 // may have null defc, name, and type fields.
   642 // may have null defc, name, and type fields.
   600 // Resolving it plants a vmtarget/vmindex in it,
   643 // Resolving it plants a vmtarget/vmindex in it,
   991       else
  1034       else
   992         ptype_oop = insert_ptype->java_mirror();
  1035         ptype_oop = insert_ptype->java_mirror();
   993       pnum += 1;
  1036       pnum += 1;
   994       mnum += 1;
  1037       mnum += 1;
   995     }
  1038     }
       
  1039     klassOop  pklass = NULL;
       
  1040     BasicType ptype  = T_OBJECT;
       
  1041     if (ptype_oop != NULL)
       
  1042       ptype = java_lang_Class::as_BasicType(ptype_oop, &pklass);
       
  1043     else
       
  1044       // null does not match any non-reference; use Object to report the error
       
  1045       pklass = SystemDictionary::Object_klass();
   996     klassOop  mklass = NULL;
  1046     klassOop  mklass = NULL;
   997     BasicType mtype  = ss.type();
  1047     BasicType mtype  = ss.type();
   998     if (mtype == T_ARRAY)  mtype = T_OBJECT; // fold all refs to T_OBJECT
  1048     if (mtype == T_ARRAY)  mtype = T_OBJECT; // fold all refs to T_OBJECT
   999     if (mtype == T_OBJECT) {
  1049     if (mtype == T_OBJECT) {
  1000       if (ptype_oop == NULL) {
  1050       if (ptype_oop == NULL) {
  1001         // null matches any reference
  1051         // null matches any reference
  1002         continue;
  1052         continue;
  1003       }
  1053       }
       
  1054       KlassHandle pklass_handle(THREAD, pklass); pklass = NULL;
  1004       // If we fail to resolve types at this point, we will throw an error.
  1055       // If we fail to resolve types at this point, we will throw an error.
  1005       symbolOop    name_oop = ss.as_symbol(CHECK);
  1056       symbolOop    name_oop = ss.as_symbol(CHECK);
  1006       symbolHandle name(THREAD, name_oop);
  1057       symbolHandle name(THREAD, name_oop);
  1007       instanceKlass* mk = instanceKlass::cast(m->method_holder());
  1058       instanceKlass* mk = instanceKlass::cast(m->method_holder());
  1008       Handle loader(THREAD, mk->class_loader());
  1059       Handle loader(THREAD, mk->class_loader());
  1009       Handle domain(THREAD, mk->protection_domain());
  1060       Handle domain(THREAD, mk->protection_domain());
  1010       mklass = SystemDictionary::resolve_or_fail(name, loader, domain,
  1061       mklass = SystemDictionary::resolve_or_null(name, loader, domain, CHECK);
  1011                                                  true, CHECK);
  1062       pklass = pklass_handle();
  1012     }
  1063       if (mklass == NULL && pklass != NULL &&
  1013     if (ptype_oop == NULL) {
  1064           Klass::cast(pklass)->name() == name() &&
  1014       // null does not match any non-reference; use Object to report the error
  1065           m->is_method_handle_invoke()) {
  1015       ptype_oop = object_java_mirror();
  1066         // Assume a match.  We can't really decode the signature of MH.invoke*.
  1016     }
  1067         continue;
  1017     klassOop  pklass = NULL;
  1068       }
  1018     BasicType ptype  = java_lang_Class::as_BasicType(ptype_oop, &pklass);
  1069     }
  1019     if (!ss.at_return_type()) {
  1070     if (!ss.at_return_type()) {
  1020       err = check_argument_type_change(ptype, pklass, mtype, mklass, mnum);
  1071       err = check_argument_type_change(ptype, pklass, mtype, mklass, mnum);
  1021     } else {
  1072     } else {
  1022       err = check_return_type_change(mtype, mklass, ptype, pklass); // note reversal!
  1073       err = check_return_type_change(mtype, mklass, ptype, pklass); // note reversal!
  1023     }
  1074     }