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 } |