8009731: Confusing error message for loader constraint violation
Fix text, overwritten type and holder for resolved method Reviewed-by: coleenp, dcubed, minqi, dholmes
This commit is contained in:
parent
087b089a1f
commit
b79e2c6803
@ -2185,10 +2185,9 @@ Symbol* SystemDictionary::find_resolution_error(constantPoolHandle pool, int whi
|
||||
// Make sure all class components (including arrays) in the given
|
||||
// signature will be resolved to the same class in both loaders.
|
||||
// Returns the name of the type that failed a loader constraint check, or
|
||||
// NULL if no constraint failed. The returned C string needs cleaning up
|
||||
// with a ResourceMark in the caller. No exception except OOME is thrown.
|
||||
// NULL if no constraint failed. No exception except OOME is thrown.
|
||||
// Arrays are not added to the loader constraint table, their elements are.
|
||||
char* SystemDictionary::check_signature_loaders(Symbol* signature,
|
||||
Symbol* SystemDictionary::check_signature_loaders(Symbol* signature,
|
||||
Handle loader1, Handle loader2,
|
||||
bool is_method, TRAPS) {
|
||||
// Nothing to do if loaders are the same.
|
||||
@ -2196,14 +2195,12 @@ char* SystemDictionary::check_signature_loaders(Symbol* signature,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ResourceMark rm(THREAD);
|
||||
SignatureStream sig_strm(signature, is_method);
|
||||
while (!sig_strm.is_done()) {
|
||||
if (sig_strm.is_object()) {
|
||||
Symbol* s = sig_strm.as_symbol(CHECK_NULL);
|
||||
Symbol* sig = s;
|
||||
Symbol* sig = sig_strm.as_symbol(CHECK_NULL);
|
||||
if (!add_loader_constraint(sig, loader1, loader2, THREAD)) {
|
||||
return sig->as_C_string();
|
||||
return sig;
|
||||
}
|
||||
}
|
||||
sig_strm.next();
|
||||
|
@ -483,8 +483,8 @@ public:
|
||||
// Check class loader constraints
|
||||
static bool add_loader_constraint(Symbol* name, Handle loader1,
|
||||
Handle loader2, TRAPS);
|
||||
static char* check_signature_loaders(Symbol* signature, Handle loader1,
|
||||
Handle loader2, bool is_method, TRAPS);
|
||||
static Symbol* check_signature_loaders(Symbol* signature, Handle loader1,
|
||||
Handle loader2, bool is_method, TRAPS);
|
||||
|
||||
// JSR 292
|
||||
// find a java.lang.invoke.MethodHandle.invoke* method for a given signature
|
||||
|
@ -458,25 +458,27 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res
|
||||
Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
|
||||
{
|
||||
ResourceMark rm(THREAD);
|
||||
char* failed_type_name =
|
||||
Symbol* failed_type_symbol =
|
||||
SystemDictionary::check_signature_loaders(method_signature, loader,
|
||||
class_loader, true, CHECK);
|
||||
if (failed_type_name != NULL) {
|
||||
if (failed_type_symbol != NULL) {
|
||||
const char* msg = "loader constraint violation: when resolving method"
|
||||
" \"%s\" the class loader (instance of %s) of the current class, %s,"
|
||||
" and the class loader (instance of %s) for resolved class, %s, have"
|
||||
" and the class loader (instance of %s) for the method's defining class, %s, have"
|
||||
" different Class objects for the type %s used in the signature";
|
||||
char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
|
||||
const char* loader1 = SystemDictionary::loader_name(loader());
|
||||
char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
|
||||
const char* loader2 = SystemDictionary::loader_name(class_loader());
|
||||
char* resolved = InstanceKlass::cast(resolved_klass())->name()->as_C_string();
|
||||
char* target = InstanceKlass::cast(resolved_method->method_holder())
|
||||
->name()->as_C_string();
|
||||
char* failed_type_name = failed_type_symbol->as_C_string();
|
||||
size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
|
||||
strlen(current) + strlen(loader2) + strlen(resolved) +
|
||||
strlen(failed_type_name);
|
||||
strlen(current) + strlen(loader2) + strlen(target) +
|
||||
strlen(failed_type_name) + 1;
|
||||
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
|
||||
jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
|
||||
resolved, failed_type_name);
|
||||
target, failed_type_name);
|
||||
THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
|
||||
}
|
||||
}
|
||||
@ -520,26 +522,28 @@ void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
|
||||
Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
|
||||
{
|
||||
ResourceMark rm(THREAD);
|
||||
char* failed_type_name =
|
||||
Symbol* failed_type_symbol =
|
||||
SystemDictionary::check_signature_loaders(method_signature, loader,
|
||||
class_loader, true, CHECK);
|
||||
if (failed_type_name != NULL) {
|
||||
if (failed_type_symbol != NULL) {
|
||||
const char* msg = "loader constraint violation: when resolving "
|
||||
"interface method \"%s\" the class loader (instance of %s) of the "
|
||||
"current class, %s, and the class loader (instance of %s) for "
|
||||
"resolved class, %s, have different Class objects for the type %s "
|
||||
"the method's defining class, %s, have different Class objects for the type %s "
|
||||
"used in the signature";
|
||||
char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
|
||||
const char* loader1 = SystemDictionary::loader_name(loader());
|
||||
char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
|
||||
const char* loader2 = SystemDictionary::loader_name(class_loader());
|
||||
char* resolved = InstanceKlass::cast(resolved_klass())->name()->as_C_string();
|
||||
char* target = InstanceKlass::cast(resolved_method->method_holder())
|
||||
->name()->as_C_string();
|
||||
char* failed_type_name = failed_type_symbol->as_C_string();
|
||||
size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
|
||||
strlen(current) + strlen(loader2) + strlen(resolved) +
|
||||
strlen(failed_type_name);
|
||||
strlen(current) + strlen(loader2) + strlen(target) +
|
||||
strlen(failed_type_name) + 1;
|
||||
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
|
||||
jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
|
||||
resolved, failed_type_name);
|
||||
target, failed_type_name);
|
||||
THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
|
||||
}
|
||||
}
|
||||
@ -642,12 +646,12 @@ void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle poo
|
||||
Symbol* signature_ref = pool->signature_ref_at(index);
|
||||
{
|
||||
ResourceMark rm(THREAD);
|
||||
char* failed_type_name =
|
||||
Symbol* failed_type_symbol =
|
||||
SystemDictionary::check_signature_loaders(signature_ref,
|
||||
ref_loader, sel_loader,
|
||||
false,
|
||||
CHECK);
|
||||
if (failed_type_name != NULL) {
|
||||
if (failed_type_symbol != NULL) {
|
||||
const char* msg = "loader constraint violation: when resolving field"
|
||||
" \"%s\" the class loader (instance of %s) of the referring class, "
|
||||
"%s, and the class loader (instance of %s) for the field's resolved "
|
||||
@ -656,8 +660,9 @@ void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle poo
|
||||
const char* loader1 = SystemDictionary::loader_name(ref_loader());
|
||||
char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string();
|
||||
const char* loader2 = SystemDictionary::loader_name(sel_loader());
|
||||
char* failed_type_name = failed_type_symbol->as_C_string();
|
||||
size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
|
||||
strlen(sel) + strlen(loader2) + strlen(failed_type_name);
|
||||
strlen(sel) + strlen(loader2) + strlen(failed_type_name) + 1;
|
||||
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
|
||||
jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
|
||||
failed_type_name);
|
||||
|
@ -327,11 +327,11 @@ bool klassVtable::update_inherited_vtable(InstanceKlass* klass, methodHandle tar
|
||||
|
||||
if (target_loader() != super_loader()) {
|
||||
ResourceMark rm(THREAD);
|
||||
char* failed_type_name =
|
||||
Symbol* failed_type_symbol =
|
||||
SystemDictionary::check_signature_loaders(signature, target_loader,
|
||||
super_loader, true,
|
||||
CHECK_(false));
|
||||
if (failed_type_name != NULL) {
|
||||
if (failed_type_symbol != NULL) {
|
||||
const char* msg = "loader constraint violation: when resolving "
|
||||
"overridden method \"%s\" the class loader (instance"
|
||||
" of %s) of the current class, %s, and its superclass loader "
|
||||
@ -341,6 +341,7 @@ bool klassVtable::update_inherited_vtable(InstanceKlass* klass, methodHandle tar
|
||||
const char* loader1 = SystemDictionary::loader_name(target_loader());
|
||||
char* current = _klass->name()->as_C_string();
|
||||
const char* loader2 = SystemDictionary::loader_name(super_loader());
|
||||
char* failed_type_name = failed_type_symbol->as_C_string();
|
||||
size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
|
||||
strlen(current) + strlen(loader2) + strlen(failed_type_name);
|
||||
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
|
||||
@ -787,12 +788,12 @@ void klassItable::initialize_itable_for_interface(int method_table_offset, Klass
|
||||
Handle method_holder_loader (THREAD, target->method_holder()->class_loader());
|
||||
if (method_holder_loader() != interface_loader()) {
|
||||
ResourceMark rm(THREAD);
|
||||
char* failed_type_name =
|
||||
Symbol* failed_type_symbol =
|
||||
SystemDictionary::check_signature_loaders(method_signature,
|
||||
method_holder_loader,
|
||||
interface_loader,
|
||||
true, CHECK);
|
||||
if (failed_type_name != NULL) {
|
||||
if (failed_type_symbol != NULL) {
|
||||
const char* msg = "loader constraint violation in interface "
|
||||
"itable initialization: when resolving method \"%s\" the class"
|
||||
" loader (instance of %s) of the current class, %s, "
|
||||
@ -804,6 +805,7 @@ void klassItable::initialize_itable_for_interface(int method_table_offset, Klass
|
||||
char* current = klass->name()->as_C_string();
|
||||
const char* loader2 = SystemDictionary::loader_name(interface_loader());
|
||||
char* iface = InstanceKlass::cast(interf_h())->name()->as_C_string();
|
||||
char* failed_type_name = failed_type_symbol->as_C_string();
|
||||
size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
|
||||
strlen(current) + strlen(loader2) + strlen(iface) +
|
||||
strlen(failed_type_name);
|
||||
|
Loading…
Reference in New Issue
Block a user