1213 method_holder->class_in_module_of_loader(false, true));
1214 THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string());
1215 }
1216 }
1217 }
1218 }
1219 ime++;
1220 }
1221 }
1222
1223 void klassItable::initialize_itable_and_check_constraints(TRAPS) {
1224 // Save a super interface from each itable entry to do constraint checking
1225 ResourceMark rm(THREAD);
1226 GrowableArray<Method*>* supers =
1227 new GrowableArray<Method*>(_size_method_table, _size_method_table, nullptr);
1228 initialize_itable(supers);
1229 check_constraints(supers, CHECK);
1230 }
1231
1232 inline bool interface_method_needs_itable_index(Method* m) {
1233 if (m->is_static()) return false; // e.g., Stream.empty
1234 if (m->is_object_initializer()) return false; // <init>
1235 if (m->is_static_initializer()) return false; // <clinit>
1236 if (m->is_private()) return false; // uses direct call
1237 // If an interface redeclares a method from java.lang.Object,
1238 // it should already have a vtable index, don't touch it.
1239 // e.g., CharSequence.toString (from initialize_vtable)
1240 // if (m->has_vtable_index()) return false; // NO!
1241 return true;
1242 }
1243
1244 int klassItable::assign_itable_indices_for_interface(InstanceKlass* klass) {
1245 // an interface does not have an itable, but its methods need to be numbered
1246 if (log_develop_is_enabled(Trace, itables)) {
1247 ResourceMark rm;
1248 log_develop_debug(itables)("%3d: Initializing itable indices for interface %s",
1249 ++initialize_count, klass->name()->as_C_string());
1250 }
1251
1252 Array<Method*>* methods = klass->methods();
1253 int nof_methods = methods->length();
1254 int ime_num = 0;
1255 for (int i = 0; i < nof_methods; i++) {
1256 Method* m = methods->at(i);
|
1213 method_holder->class_in_module_of_loader(false, true));
1214 THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string());
1215 }
1216 }
1217 }
1218 }
1219 ime++;
1220 }
1221 }
1222
1223 void klassItable::initialize_itable_and_check_constraints(TRAPS) {
1224 // Save a super interface from each itable entry to do constraint checking
1225 ResourceMark rm(THREAD);
1226 GrowableArray<Method*>* supers =
1227 new GrowableArray<Method*>(_size_method_table, _size_method_table, nullptr);
1228 initialize_itable(supers);
1229 check_constraints(supers, CHECK);
1230 }
1231
1232 inline bool interface_method_needs_itable_index(Method* m) {
1233 if (m->is_static()) return false; // e.g., Stream.empty
1234 if (m->is_private()) return false; // uses direct call
1235 if (m->is_object_constructor()) return false; // <init>(...)V
1236 if (m->is_class_initializer()) return false; // <clinit>()V
1237 // If an interface redeclares a method from java.lang.Object,
1238 // it should already have a vtable index, don't touch it.
1239 // e.g., CharSequence.toString (from initialize_vtable)
1240 // if (m->has_vtable_index()) return false; // NO!
1241 return true;
1242 }
1243
1244 int klassItable::assign_itable_indices_for_interface(InstanceKlass* klass) {
1245 // an interface does not have an itable, but its methods need to be numbered
1246 if (log_develop_is_enabled(Trace, itables)) {
1247 ResourceMark rm;
1248 log_develop_debug(itables)("%3d: Initializing itable indices for interface %s",
1249 ++initialize_count, klass->name()->as_C_string());
1250 }
1251
1252 Array<Method*>* methods = klass->methods();
1253 int nof_methods = methods->length();
1254 int ime_num = 0;
1255 for (int i = 0; i < nof_methods; i++) {
1256 Method* m = methods->at(i);
|