< prev index next >
src/hotspot/share/classfile/javaClasses.cpp
Print this page
rev 50339 : 8203824: Chain exception from initialization in later NoClassDefFoundErrors.
@@ -1303,10 +1303,15 @@
void java_lang_Class::set_signers(oop java_class, objArrayOop signers) {
assert(_signers_offset != 0, "must be set");
java_class->obj_field_put(_signers_offset, (oop)signers);
}
+// Accessor for field containing exception thrown during class initialization.
+oop java_lang_Class::exceptionThrownDuringClinit(oop java_class) {
+ assert(_exceptionThrownDuringClinit_offset != 0, "must be set");
+ return java_class->obj_field(_exceptionThrownDuringClinit_offset);
+}
void java_lang_Class::set_class_loader(oop java_class, oop loader) {
// jdk7 runs Queens in bootstrapping and jdk8-9 has no coordinated pushes yet.
if (_class_loader_offset != 0) {
java_class->obj_field_put(_class_loader_offset, loader);
@@ -1490,10 +1495,11 @@
return mirror;
}
bool java_lang_Class::offsets_computed = false;
int java_lang_Class::classRedefinedCount_offset = -1;
+int java_lang_Class::_exceptionThrownDuringClinit_offset = -1;
#define CLASS_FIELDS_DO(macro) \
macro(classRedefinedCount_offset, k, "classRedefinedCount", int_signature, false) ; \
macro(_class_loader_offset, k, "classLoader", classloader_signature, false); \
macro(_component_mirror_offset, k, "componentType", class_signature, false); \
@@ -1507,10 +1513,13 @@
offsets_computed = true;
InstanceKlass* k = SystemDictionary::Class_klass();
CLASS_FIELDS_DO(FIELD_COMPUTE_OFFSET);
+ compute_offset(_exceptionThrownDuringClinit_offset, k,
+ vmSymbols::exceptionThrownDuringClinit_name(), vmSymbols::throwable_signature());
+
// Init lock is a C union with component_mirror. Only instanceKlass mirrors have
// init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops
// GC treats them the same.
_init_lock_offset = _component_mirror_offset;
@@ -1852,10 +1861,11 @@
#define THROWABLE_FIELDS_DO(macro) \
macro(backtrace_offset, k, "backtrace", object_signature, false); \
macro(detailMessage_offset, k, "detailMessage", string_signature, false); \
macro(stackTrace_offset, k, "stackTrace", java_lang_StackTraceElement_array, false); \
macro(depth_offset, k, "depth", int_signature, false); \
+ macro(cause_offset, k, "cause", throwable_signature, false); \
macro(static_unassigned_stacktrace_offset, k, "UNASSIGNED_STACK", java_lang_StackTraceElement_array, true)
void java_lang_Throwable::compute_offsets() {
InstanceKlass* k = SystemDictionary::Throwable_klass();
THROWABLE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
@@ -1907,10 +1917,14 @@
void java_lang_Throwable::set_message(oop throwable, oop value) {
throwable->obj_field_put(detailMessage_offset, value);
}
+void java_lang_Throwable::set_cause(oop throwable, oop cause) {
+ assert(cause_offset != 0, "not yet initialized");
+ throwable->obj_field_put(cause_offset, cause);
+}
void java_lang_Throwable::set_stacktrace(oop throwable, oop st_element_array) {
throwable->obj_field_put(stackTrace_offset, st_element_array);
}
@@ -4182,10 +4196,11 @@
int java_lang_Class::_signers_offset;
GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;
GrowableArray<Klass*>* java_lang_Class::_fixup_module_field_list = NULL;
int java_lang_Throwable::backtrace_offset;
int java_lang_Throwable::detailMessage_offset;
+int java_lang_Throwable::cause_offset;
int java_lang_Throwable::stackTrace_offset;
int java_lang_Throwable::depth_offset;
int java_lang_Throwable::static_unassigned_stacktrace_offset;
int java_lang_reflect_AccessibleObject::override_offset;
int java_lang_reflect_Method::clazz_offset;
< prev index next >