Mercurial > hg > truffle
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 } |