< prev index next >
src/hotspot/share/oops/instanceKlass.cpp
Print this page
rev 50866 : 8203826: Chain exception from initialization in later NoClassDefFoundErrors.
*** 935,952 ****
DTRACE_CLASSINIT_PROBE_WAIT(erroneous, -1, wait);
ResourceMark rm(THREAD);
const char* desc = "Could not initialize class ";
const char* className = external_name();
size_t msglen = strlen(desc) + strlen(className) + 1;
! char* message = NEW_RESOURCE_ARRAY(char, msglen);
if (NULL == message) {
// Out of memory: can't create detailed error message
! THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), className);
} else {
jio_snprintf(message, msglen, "%s%s", desc, className);
- THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), message);
}
}
// Step 6
set_init_state(being_initialized);
set_init_thread(self);
--- 935,956 ----
DTRACE_CLASSINIT_PROBE_WAIT(erroneous, -1, wait);
ResourceMark rm(THREAD);
const char* desc = "Could not initialize class ";
const char* className = external_name();
size_t msglen = strlen(desc) + strlen(className) + 1;
! char* message = NEW_RESOURCE_ARRAY_IN_THREAD_RETURN_NULL(THREAD, char, msglen);
if (NULL == message) {
// Out of memory: can't create detailed error message
! message = const_cast<char*>(className);
} else {
jio_snprintf(message, msglen, "%s%s", desc, className);
}
+ Exceptions::_throw_msg_cause(THREAD_AND_LOCATION,
+ vmSymbols::java_lang_NoClassDefFoundError(),
+ message,
+ class_loader_data()->query_init_exception(java_mirror_handle(), THREAD));
+ return;
}
// Step 6
set_init_state(being_initialized);
set_init_thread(self);
*** 972,981 ****
--- 976,986 ----
if (HAS_PENDING_EXCEPTION) {
Handle e(THREAD, PENDING_EXCEPTION);
CLEAR_PENDING_EXCEPTION;
{
EXCEPTION_MARK;
+ class_loader_data()->record_init_exception(java_mirror_handle(), e, THREAD);
// Locks object, set state, and notify all waiting threads
set_initialization_state_and_notify(initialization_error, THREAD);
CLEAR_PENDING_EXCEPTION;
}
DTRACE_CLASSINIT_PROBE_WAIT(super__failed, -1, wait);
*** 1024,1041 ****
// JVMTI has already reported the pending exception
// JVMTI internal flag reset is needed in order to report ExceptionInInitializerError
JvmtiExport::clear_detected_exception((JavaThread*)THREAD);
}
DTRACE_CLASSINIT_PROBE_WAIT(error, -1, wait);
! if (e->is_a(SystemDictionary::Error_klass())) {
! THROW_OOP(e());
! } else {
JavaCallArguments args(e);
! THROW_ARG(vmSymbols::java_lang_ExceptionInInitializerError(),
vmSymbols::throwable_void_signature(),
! &args);
}
}
DTRACE_CLASSINIT_PROBE_WAIT(end, -1, wait);
}
--- 1029,1052 ----
// JVMTI has already reported the pending exception
// JVMTI internal flag reset is needed in order to report ExceptionInInitializerError
JvmtiExport::clear_detected_exception((JavaThread*)THREAD);
}
DTRACE_CLASSINIT_PROBE_WAIT(error, -1, wait);
! if (!e->is_a(SystemDictionary::Error_klass())) {
! // Wrap anything but errors into ExceptionInInitializerError.
JavaCallArguments args(e);
! Handle h_loader(THREAD, NULL);
! Handle h_prot(THREAD, NULL);
! e = Exceptions::new_exception(THREAD,
! vmSymbols::java_lang_ExceptionInInitializerError(),
vmSymbols::throwable_void_signature(),
! &args, h_loader, h_prot);
}
+ // Store the exception that originally caused <clinit> to fail so
+ // it can be chained into potential later NoClassDefFoundErrors.
+ class_loader_data()->record_init_exception(java_mirror_handle(), e, THREAD);
+ THROW_OOP(e());
}
DTRACE_CLASSINIT_PROBE_WAIT(end, -1, wait);
}
< prev index next >