< prev index next >
src/hotspot/share/oops/klassVtable.cpp
Print this page
*** 477,487 ****
// overriding. They may also override other methods.
if (!target_method()->is_package_private()) {
allocate_new = false;
}
! if (checkconstraints) {
// Override vtable entry if passes loader constraint check
// if loader constraint checking requested
// No need to visit his super, since he and his super
// have already made any needed loader constraints.
// Since loader constraints are transitive, it is enough
--- 477,490 ----
// overriding. They may also override other methods.
if (!target_method()->is_package_private()) {
allocate_new = false;
}
! // Do not check loader constraints for overpass methods because overpass
! // methods are created by the jvm to throw exceptions. They are not
! // resolved methods.
! if (checkconstraints && !target_method()->is_overpass()) {
// Override vtable entry if passes loader constraint check
// if loader constraint checking requested
// No need to visit his super, since he and his super
// have already made any needed loader constraints.
// Since loader constraints are transitive, it is enough
*** 493,517 ****
Symbol* failed_type_symbol =
SystemDictionary::check_signature_loaders(signature, target_loader,
super_loader, true,
CHECK_(false));
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 "
! "(instance of %s), have different Class objects for the type "
! "%s used in the signature";
char* sig = target_method()->name_and_sig_as_C_string();
const char* loader1 = SystemDictionary::loader_name(target_loader());
! char* current = target_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);
! jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
! failed_type_name);
THROW_MSG_(vmSymbols::java_lang_LinkageError(), buf, false);
}
}
}
--- 496,522 ----
Symbol* failed_type_symbol =
SystemDictionary::check_signature_loaders(signature, target_loader,
super_loader, true,
CHECK_(false));
if (failed_type_symbol != NULL) {
! const char* msg = "loader constraint violation for class %s: when resolving "
! "overriding method \"%s\" the class loader (instance of %s) of the "
! "selected method's type, %s, and the class loader (instance of %s) for its super "
! "type %s have different Class objects for the type %s used in the signature";
! char* curr_class = klass->name()->as_C_string();
char* sig = target_method()->name_and_sig_as_C_string();
const char* loader1 = SystemDictionary::loader_name(target_loader());
! char* sel_class = target_klass->name()->as_C_string();
const char* loader2 = SystemDictionary::loader_name(super_loader());
+ char* super_class = super_klass->name()->as_C_string();
char* failed_type_name = failed_type_symbol->as_C_string();
! size_t buflen = strlen(msg) + strlen(curr_class) + strlen(sig) +
! strlen(loader1) + strlen(sel_class) + strlen(loader2) +
! strlen(super_class) + strlen(failed_type_name);
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
! jio_snprintf(buf, buflen, msg, curr_class, sig, loader1, sel_class, loader2,
! super_class, failed_type_name);
THROW_MSG_(vmSymbols::java_lang_LinkageError(), buf, false);
}
}
}
*** 1191,1203 ****
if (m->has_itable_index()) {
// This search must match the runtime resolution, i.e. selection search for invokeinterface
// to correctly enforce loader constraints for interface method inheritance
target = LinkResolver::lookup_instance_method_in_klasses(_klass, m->name(), m->signature(), CHECK);
}
! if (target == NULL || !target->is_public() || target->is_abstract()) {
! // Entry does not resolve. Leave it empty for AbstractMethodError.
! if (!(target == NULL) && !target->is_public()) {
// Stuff an IllegalAccessError throwing method in there instead.
itableOffsetEntry::method_entry(_klass, method_table_offset)[m->itable_index()].
initialize(Universe::throw_illegal_access_error());
}
} else {
--- 1196,1208 ----
if (m->has_itable_index()) {
// This search must match the runtime resolution, i.e. selection search for invokeinterface
// to correctly enforce loader constraints for interface method inheritance
target = LinkResolver::lookup_instance_method_in_klasses(_klass, m->name(), m->signature(), CHECK);
}
! if (target == NULL || !target->is_public() || target->is_abstract() || target->is_overpass()) {
! // Entry does not resolve. Leave it empty for AbstractMethodError or other error.
! if (!(target == NULL) && !target->is_public() && !target->is_overpass()) {
// Stuff an IllegalAccessError throwing method in there instead.
itableOffsetEntry::method_entry(_klass, method_table_offset)[m->itable_index()].
initialize(Universe::throw_illegal_access_error());
}
} else {
*** 1211,1238 ****
SystemDictionary::check_signature_loaders(m->signature(),
method_holder_loader,
interface_loader,
true, CHECK);
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, "
! "and the class loader (instance of %s) for interface "
! "%s have different Class objects for the type %s "
! "used in the signature";
! char* sig = target()->name_and_sig_as_C_string();
! const char* loader1 = SystemDictionary::loader_name(method_holder_loader());
char* current = _klass->name()->as_C_string();
! const char* loader2 = SystemDictionary::loader_name(interface_loader());
char* iface = InstanceKlass::cast(interf)->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);
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
! jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
! iface, failed_type_name);
THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
}
}
}
--- 1216,1243 ----
SystemDictionary::check_signature_loaders(m->signature(),
method_holder_loader,
interface_loader,
true, CHECK);
if (failed_type_symbol != NULL) {
! const char* msg = "loader constraint violation in interface itable"
! " initialization for class %s: when resolving method \"%s\" the"
! " class loader (instance of %s) for super interface %s, and the class"
! " loader (instance of %s) of the selected method's type, %s have"
! " different Class objects for the type %s used in the signature";
char* current = _klass->name()->as_C_string();
! char* sig = m->name_and_sig_as_C_string();
! const char* loader1 = SystemDictionary::loader_name(interface_loader());
char* iface = InstanceKlass::cast(interf)->name()->as_C_string();
+ const char* loader2 = SystemDictionary::loader_name(method_holder_loader());
+ char* mclass = target()->method_holder()->name()->as_C_string();
char* failed_type_name = failed_type_symbol->as_C_string();
! size_t buflen = strlen(msg) + strlen(current) + strlen(sig) +
! strlen(loader1) + strlen(iface) + strlen(loader2) + strlen(mclass) +
strlen(failed_type_name);
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
! jio_snprintf(buf, buflen, msg, current, sig, loader1, iface,
! loader2, mclass, failed_type_name);
THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
}
}
}
< prev index next >