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