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