< 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 >