667 ResourceMark rm(THREAD); |
667 ResourceMark rm(THREAD); |
668 Symbol* failed_type_symbol = |
668 Symbol* failed_type_symbol = |
669 SystemDictionary::check_signature_loaders(link_info.signature(), current_loader, |
669 SystemDictionary::check_signature_loaders(link_info.signature(), current_loader, |
670 resolved_loader, true, CHECK); |
670 resolved_loader, true, CHECK); |
671 if (failed_type_symbol != NULL) { |
671 if (failed_type_symbol != NULL) { |
672 const char* msg = "loader constraint violation: when resolving %s" |
672 Klass* current_class = link_info.current_klass(); |
673 " \"%s\" the class loader %s of the current class, %s," |
673 ClassLoaderData* current_loader_data = current_class->class_loader_data(); |
674 " and the class loader %s for the method's defining class, %s, have" |
674 assert(current_loader_data != NULL, "current class has no class loader data"); |
675 " different Class objects for the type %s used in the signature"; |
675 Klass* resolved_method_class = resolved_method->method_holder(); |
676 char* sig = link_info.method_string(); |
676 ClassLoaderData* target_loader_data = resolved_method_class->class_loader_data(); |
677 const char* loader1_name = java_lang_ClassLoader::describe_external(current_loader()); |
677 assert(target_loader_data != NULL, "resolved method's class has no class loader data"); |
678 char* current = link_info.current_klass()->name()->as_C_string(); |
678 |
679 const char* loader2_name = java_lang_ClassLoader::describe_external(resolved_loader()); |
679 stringStream ss; |
680 char* target = resolved_method->method_holder()->name()->as_C_string(); |
680 ss.print("loader constraint violation: when resolving %s" |
681 char* failed_type_name = failed_type_symbol->as_C_string(); |
681 " \"%s\" the class loader %s of the current class, %s," |
682 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1_name) + |
682 " and the class loader %s for the method's defining class, %s, have" |
683 strlen(current) + strlen(loader2_name) + strlen(target) + |
683 " different Class objects for the type %s used in the signature (%s; %s)", |
684 strlen(failed_type_name) + strlen(method_type) + 1; |
684 method_type, |
685 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen); |
685 link_info.method_string(), |
686 jio_snprintf(buf, buflen, msg, method_type, sig, loader1_name, current, loader2_name, |
686 current_loader_data->loader_name_and_id(), |
687 target, failed_type_name); |
687 current_class->name()->as_C_string(), |
688 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf); |
688 target_loader_data->loader_name_and_id(), |
|
689 resolved_method_class->name()->as_C_string(), |
|
690 failed_type_symbol->as_C_string(), |
|
691 current_class->class_in_module_of_loader(false, true), |
|
692 resolved_method_class->class_in_module_of_loader(false, true)); |
|
693 THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string()); |
689 } |
694 } |
690 } |
695 } |
691 |
696 |
692 void LinkResolver::check_field_loader_constraints(Symbol* field, Symbol* sig, |
697 void LinkResolver::check_field_loader_constraints(Symbol* field, Symbol* sig, |
693 Klass* current_klass, |
698 Klass* current_klass, |
700 SystemDictionary::check_signature_loaders(sig, |
705 SystemDictionary::check_signature_loaders(sig, |
701 ref_loader, sel_loader, |
706 ref_loader, sel_loader, |
702 false, |
707 false, |
703 CHECK); |
708 CHECK); |
704 if (failed_type_symbol != NULL) { |
709 if (failed_type_symbol != NULL) { |
705 const char* msg = "loader constraint violation: when resolving field" |
710 stringStream ss; |
706 " \"%s\" of type %s, the class loader %s of the current class, " |
|
707 "%s, and the class loader %s for the field's defining " |
|
708 "type, %s, have different Class objects for type %s"; |
|
709 const char* field_name = field->as_C_string(); |
|
710 const char* loader1_name = java_lang_ClassLoader::describe_external(ref_loader()); |
|
711 const char* sel = sel_klass->external_name(); |
|
712 const char* loader2_name = java_lang_ClassLoader::describe_external(sel_loader()); |
|
713 const char* failed_type_name = failed_type_symbol->as_klass_external_name(); |
711 const char* failed_type_name = failed_type_symbol->as_klass_external_name(); |
714 const char* curr_klass_name = current_klass->external_name(); |
712 |
715 size_t buflen = strlen(msg) + strlen(field_name) + 2 * strlen(failed_type_name) + |
713 ss.print("loader constraint violation: when resolving field" |
716 strlen(loader1_name) + strlen(curr_klass_name) + |
714 " \"%s\" of type %s, the class loader %s of the current class, " |
717 strlen(loader2_name) + strlen(sel) + 1; |
715 "%s, and the class loader %s for the field's defining " |
718 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen); |
716 "type, %s, have different Class objects for type %s (%s; %s)", |
719 jio_snprintf(buf, buflen, msg, field_name, failed_type_name, loader1_name, |
717 field->as_C_string(), |
720 curr_klass_name, loader2_name, sel, failed_type_name); |
718 failed_type_name, |
721 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf); |
719 current_klass->class_loader_data()->loader_name_and_id(), |
|
720 current_klass->external_name(), |
|
721 sel_klass->class_loader_data()->loader_name_and_id(), |
|
722 sel_klass->external_name(), |
|
723 failed_type_name, |
|
724 current_klass->class_in_module_of_loader(false, true), |
|
725 sel_klass->class_in_module_of_loader(false, true)); |
|
726 THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string()); |
722 } |
727 } |
723 } |
728 } |
724 |
729 |
725 methodHandle LinkResolver::resolve_method(const LinkInfo& link_info, |
730 methodHandle LinkResolver::resolve_method(const LinkInfo& link_info, |
726 Bytecodes::Code code, TRAPS) { |
731 Bytecodes::Code code, TRAPS) { |