< prev index next >

src/hotspot/share/oops/instanceKlass.cpp

Print this page




1106     // If any exceptions, complete abruptly, throwing the same exception as above.
1107     if (HAS_PENDING_EXCEPTION) {
1108       Handle e(THREAD, PENDING_EXCEPTION);
1109       CLEAR_PENDING_EXCEPTION;
1110       {
1111         EXCEPTION_MARK;
1112         // Locks object, set state, and notify all waiting threads
1113         set_initialization_state_and_notify(initialization_error, THREAD);
1114         CLEAR_PENDING_EXCEPTION;
1115       }
1116       DTRACE_CLASSINIT_PROBE_WAIT(super__failed, -1, wait);
1117       THROW_OOP(e());
1118     }
1119   }
1120 
1121   // Step 8
1122   // Initialize classes of flattenable fields
1123   {
1124     for (AllFieldStream fs(this); !fs.done(); fs.next()) {
1125       if (fs.is_flattenable()) {
1126         InstanceKlass* field_klass = InstanceKlass::cast(this->get_value_field_klass(fs.index()));









1127         field_klass->initialize(CHECK);
1128       }
1129     }
1130   }
1131 
1132 
1133   // Look for aot compiled methods for this klass, including class initializer.
1134   AOTLoader::load_for_klass(this, THREAD);
1135 
1136   // Step 9
1137   {
1138     DTRACE_CLASSINIT_PROBE_WAIT(clinit, -1, wait);
1139     // Timer includes any side effects of class initialization (resolution,
1140     // etc), but not recursive entry into call_class_initializer().
1141     PerfClassTraceTime timer(ClassLoader::perf_class_init_time(),
1142                              ClassLoader::perf_class_init_selftime(),
1143                              ClassLoader::perf_classes_inited(),
1144                              jt->get_thread_stat()->perf_recursion_counts_addr(),
1145                              jt->get_thread_stat()->perf_timers_addr(),
1146                              PerfClassTraceTime::CLASS_CLINIT);




1106     // If any exceptions, complete abruptly, throwing the same exception as above.
1107     if (HAS_PENDING_EXCEPTION) {
1108       Handle e(THREAD, PENDING_EXCEPTION);
1109       CLEAR_PENDING_EXCEPTION;
1110       {
1111         EXCEPTION_MARK;
1112         // Locks object, set state, and notify all waiting threads
1113         set_initialization_state_and_notify(initialization_error, THREAD);
1114         CLEAR_PENDING_EXCEPTION;
1115       }
1116       DTRACE_CLASSINIT_PROBE_WAIT(super__failed, -1, wait);
1117       THROW_OOP(e());
1118     }
1119   }
1120 
1121   // Step 8
1122   // Initialize classes of flattenable fields
1123   {
1124     for (AllFieldStream fs(this); !fs.done(); fs.next()) {
1125       if (fs.is_flattenable()) {
1126         Klass* klass = this->get_value_field_klass_or_null(fs.index());
1127         if (klass == NULL) {
1128           klass = SystemDictionary::resolve_or_fail(fs.signature()->fundamental_name(THREAD), Handle(THREAD, class_loader()),
1129               Handle(THREAD, protection_domain()), true, CHECK);
1130           this->set_value_field_klass(fs.index(), InstanceKlass::cast(klass));
1131         }
1132         if (!klass->is_value()) {
1133           THROW(vmSymbols::java_lang_IncompatibleClassChangeError());
1134         }
1135         InstanceKlass* field_klass = InstanceKlass::cast(klass);
1136         field_klass->initialize(CHECK);
1137       }
1138     }
1139   }
1140 
1141 
1142   // Look for aot compiled methods for this klass, including class initializer.
1143   AOTLoader::load_for_klass(this, THREAD);
1144 
1145   // Step 9
1146   {
1147     DTRACE_CLASSINIT_PROBE_WAIT(clinit, -1, wait);
1148     // Timer includes any side effects of class initialization (resolution,
1149     // etc), but not recursive entry into call_class_initializer().
1150     PerfClassTraceTime timer(ClassLoader::perf_class_init_time(),
1151                              ClassLoader::perf_class_init_selftime(),
1152                              ClassLoader::perf_classes_inited(),
1153                              jt->get_thread_stat()->perf_recursion_counts_addr(),
1154                              jt->get_thread_stat()->perf_timers_addr(),
1155                              PerfClassTraceTime::CLASS_CLINIT);


< prev index next >