comparison src/share/vm/interpreter/linkResolver.cpp @ 8840:cd3089a56438

8009731: Confusing error message for loader constraint violation Summary: Fix text, overwritten type and holder for resolved method Reviewed-by: coleenp, dcubed, minqi, dholmes
author acorn
date Wed, 27 Mar 2013 14:10:59 -0400
parents 11d5942ef9c7
children d79859ff6535
comparison
equal deleted inserted replaced
8823:23f2d309e855 8840:cd3089a56438
456 // check loader constraints 456 // check loader constraints
457 Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader()); 457 Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
458 Handle class_loader (THREAD, resolved_method->method_holder()->class_loader()); 458 Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
459 { 459 {
460 ResourceMark rm(THREAD); 460 ResourceMark rm(THREAD);
461 char* failed_type_name = 461 Symbol* failed_type_symbol =
462 SystemDictionary::check_signature_loaders(method_signature, loader, 462 SystemDictionary::check_signature_loaders(method_signature, loader,
463 class_loader, true, CHECK); 463 class_loader, true, CHECK);
464 if (failed_type_name != NULL) { 464 if (failed_type_symbol != NULL) {
465 const char* msg = "loader constraint violation: when resolving method" 465 const char* msg = "loader constraint violation: when resolving method"
466 " \"%s\" the class loader (instance of %s) of the current class, %s," 466 " \"%s\" the class loader (instance of %s) of the current class, %s,"
467 " and the class loader (instance of %s) for resolved class, %s, have" 467 " and the class loader (instance of %s) for the method's defining class, %s, have"
468 " different Class objects for the type %s used in the signature"; 468 " different Class objects for the type %s used in the signature";
469 char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature); 469 char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
470 const char* loader1 = SystemDictionary::loader_name(loader()); 470 const char* loader1 = SystemDictionary::loader_name(loader());
471 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string(); 471 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
472 const char* loader2 = SystemDictionary::loader_name(class_loader()); 472 const char* loader2 = SystemDictionary::loader_name(class_loader());
473 char* resolved = InstanceKlass::cast(resolved_klass())->name()->as_C_string(); 473 char* target = InstanceKlass::cast(resolved_method->method_holder())
474 ->name()->as_C_string();
475 char* failed_type_name = failed_type_symbol->as_C_string();
474 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) + 476 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
475 strlen(current) + strlen(loader2) + strlen(resolved) + 477 strlen(current) + strlen(loader2) + strlen(target) +
476 strlen(failed_type_name); 478 strlen(failed_type_name) + 1;
477 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen); 479 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
478 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2, 480 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
479 resolved, failed_type_name); 481 target, failed_type_name);
480 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf); 482 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
481 } 483 }
482 } 484 }
483 } 485 }
484 } 486 }
518 HandleMark hm(THREAD); 520 HandleMark hm(THREAD);
519 Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader()); 521 Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
520 Handle class_loader (THREAD, resolved_method->method_holder()->class_loader()); 522 Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
521 { 523 {
522 ResourceMark rm(THREAD); 524 ResourceMark rm(THREAD);
523 char* failed_type_name = 525 Symbol* failed_type_symbol =
524 SystemDictionary::check_signature_loaders(method_signature, loader, 526 SystemDictionary::check_signature_loaders(method_signature, loader,
525 class_loader, true, CHECK); 527 class_loader, true, CHECK);
526 if (failed_type_name != NULL) { 528 if (failed_type_symbol != NULL) {
527 const char* msg = "loader constraint violation: when resolving " 529 const char* msg = "loader constraint violation: when resolving "
528 "interface method \"%s\" the class loader (instance of %s) of the " 530 "interface method \"%s\" the class loader (instance of %s) of the "
529 "current class, %s, and the class loader (instance of %s) for " 531 "current class, %s, and the class loader (instance of %s) for "
530 "resolved class, %s, have different Class objects for the type %s " 532 "the method's defining class, %s, have different Class objects for the type %s "
531 "used in the signature"; 533 "used in the signature";
532 char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature); 534 char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
533 const char* loader1 = SystemDictionary::loader_name(loader()); 535 const char* loader1 = SystemDictionary::loader_name(loader());
534 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string(); 536 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
535 const char* loader2 = SystemDictionary::loader_name(class_loader()); 537 const char* loader2 = SystemDictionary::loader_name(class_loader());
536 char* resolved = InstanceKlass::cast(resolved_klass())->name()->as_C_string(); 538 char* target = InstanceKlass::cast(resolved_method->method_holder())
539 ->name()->as_C_string();
540 char* failed_type_name = failed_type_symbol->as_C_string();
537 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) + 541 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
538 strlen(current) + strlen(loader2) + strlen(resolved) + 542 strlen(current) + strlen(loader2) + strlen(target) +
539 strlen(failed_type_name); 543 strlen(failed_type_name) + 1;
540 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen); 544 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
541 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2, 545 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
542 resolved, failed_type_name); 546 target, failed_type_name);
543 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf); 547 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
544 } 548 }
545 } 549 }
546 } 550 }
547 } 551 }
640 Handle ref_loader (THREAD, InstanceKlass::cast(ref_klass())->class_loader()); 644 Handle ref_loader (THREAD, InstanceKlass::cast(ref_klass())->class_loader());
641 Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader()); 645 Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
642 Symbol* signature_ref = pool->signature_ref_at(index); 646 Symbol* signature_ref = pool->signature_ref_at(index);
643 { 647 {
644 ResourceMark rm(THREAD); 648 ResourceMark rm(THREAD);
645 char* failed_type_name = 649 Symbol* failed_type_symbol =
646 SystemDictionary::check_signature_loaders(signature_ref, 650 SystemDictionary::check_signature_loaders(signature_ref,
647 ref_loader, sel_loader, 651 ref_loader, sel_loader,
648 false, 652 false,
649 CHECK); 653 CHECK);
650 if (failed_type_name != NULL) { 654 if (failed_type_symbol != NULL) {
651 const char* msg = "loader constraint violation: when resolving field" 655 const char* msg = "loader constraint violation: when resolving field"
652 " \"%s\" the class loader (instance of %s) of the referring class, " 656 " \"%s\" the class loader (instance of %s) of the referring class, "
653 "%s, and the class loader (instance of %s) for the field's resolved " 657 "%s, and the class loader (instance of %s) for the field's resolved "
654 "type, %s, have different Class objects for that type"; 658 "type, %s, have different Class objects for that type";
655 char* field_name = field->as_C_string(); 659 char* field_name = field->as_C_string();
656 const char* loader1 = SystemDictionary::loader_name(ref_loader()); 660 const char* loader1 = SystemDictionary::loader_name(ref_loader());
657 char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string(); 661 char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string();
658 const char* loader2 = SystemDictionary::loader_name(sel_loader()); 662 const char* loader2 = SystemDictionary::loader_name(sel_loader());
663 char* failed_type_name = failed_type_symbol->as_C_string();
659 size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) + 664 size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
660 strlen(sel) + strlen(loader2) + strlen(failed_type_name); 665 strlen(sel) + strlen(loader2) + strlen(failed_type_name) + 1;
661 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen); 666 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
662 jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2, 667 jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
663 failed_type_name); 668 failed_type_name);
664 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf); 669 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
665 } 670 }