298 #ifndef PRODUCT |
298 #ifndef PRODUCT |
299 Symbol* name= target_method()->name(); |
299 Symbol* name= target_method()->name(); |
300 Symbol* signature = target_method()->signature(); |
300 Symbol* signature = target_method()->signature(); |
301 assert(super_method->name() == name && super_method->signature() == signature, "vtable entry name/sig mismatch"); |
301 assert(super_method->name() == name && super_method->signature() == signature, "vtable entry name/sig mismatch"); |
302 #endif |
302 #endif |
303 if (supersuperklass->is_override(super_method, target_loader, target_classname, THREAD)) { |
303 if (supersuperklass->is_override(methodHandle(THREAD, super_method), target_loader, target_classname, THREAD)) { |
304 if (log_develop_is_enabled(Trace, vtables)) { |
304 if (log_develop_is_enabled(Trace, vtables)) { |
305 ResourceMark rm(THREAD); |
305 ResourceMark rm(THREAD); |
306 LogTarget(Trace, vtables) lt; |
306 LogTarget(Trace, vtables) lt; |
307 LogStream ls(lt); |
307 LogStream ls(lt); |
308 char* sig = target_method()->name_and_sig_as_C_string(); |
308 char* sig = target_method()->name_and_sig_as_C_string(); |
459 bool overrides = false; |
459 bool overrides = false; |
460 |
460 |
461 // private methods are also never overridden |
461 // private methods are also never overridden |
462 if (!super_method->is_private() && |
462 if (!super_method->is_private() && |
463 (is_default |
463 (is_default |
464 || ((super_klass->is_override(super_method, target_loader, target_classname, THREAD)) |
464 || ((super_klass->is_override(methodHandle(THREAD, super_method), target_loader, target_classname, THREAD)) |
465 || ((klass->major_version() >= VTABLE_TRANSITIVE_OVERRIDE_VERSION) |
465 || ((klass->major_version() >= VTABLE_TRANSITIVE_OVERRIDE_VERSION) |
466 && ((super_klass = find_transitive_override(super_klass, |
466 && ((super_klass = find_transitive_override(super_klass, |
467 target_method, i, target_loader, |
467 target_method, i, target_loader, |
468 target_classname, THREAD)) |
468 target_classname, THREAD)) |
469 != (InstanceKlass*)NULL))))) |
469 != (InstanceKlass*)NULL))))) |
648 // ignore private, c.m pub does override a.m pub |
648 // ignore private, c.m pub does override a.m pub |
649 // For classes that were not javac'd together, we also do transitive overriding around |
649 // For classes that were not javac'd together, we also do transitive overriding around |
650 // methods that have less accessibility |
650 // methods that have less accessibility |
651 if ((!super_method->is_static()) && |
651 if ((!super_method->is_static()) && |
652 (!super_method->is_private())) { |
652 (!super_method->is_private())) { |
653 if (superk->is_override(super_method, classloader, classname, THREAD)) { |
653 if (superk->is_override(methodHandle(THREAD, super_method), classloader, classname, THREAD)) { |
654 return false; |
654 return false; |
655 // else keep looking for transitive overrides |
655 // else keep looking for transitive overrides |
656 } |
656 } |
657 // If we get here then one of the super classes has a package private method |
657 // If we get here then one of the super classes has a package private method |
658 // that will not get overridden because it is in a different package. But, |
658 // that will not get overridden because it is in a different package. But, |
1195 Handle interface_loader (THREAD, interf->class_loader()); |
1195 Handle interface_loader (THREAD, interf->class_loader()); |
1196 |
1196 |
1197 int ime_count = method_count_for_interface(interf); |
1197 int ime_count = method_count_for_interface(interf); |
1198 for (int i = 0; i < nof_methods; i++) { |
1198 for (int i = 0; i < nof_methods; i++) { |
1199 Method* m = methods->at(i); |
1199 Method* m = methods->at(i); |
1200 methodHandle target; |
1200 Method* target = NULL; |
1201 if (m->has_itable_index()) { |
1201 if (m->has_itable_index()) { |
1202 // This search must match the runtime resolution, i.e. selection search for invokeinterface |
1202 // This search must match the runtime resolution, i.e. selection search for invokeinterface |
1203 // to correctly enforce loader constraints for interface method inheritance. |
1203 // to correctly enforce loader constraints for interface method inheritance. |
1204 // Private methods are skipped as a private class method can never be the implementation |
1204 // Private methods are skipped as a private class method can never be the implementation |
1205 // of an interface method. |
1205 // of an interface method. |
1220 } else { |
1220 } else { |
1221 // Entry did resolve, check loader constraints before initializing |
1221 // Entry did resolve, check loader constraints before initializing |
1222 // if checkconstraints requested |
1222 // if checkconstraints requested |
1223 if (checkconstraints) { |
1223 if (checkconstraints) { |
1224 Handle method_holder_loader (THREAD, target->method_holder()->class_loader()); |
1224 Handle method_holder_loader (THREAD, target->method_holder()->class_loader()); |
|
1225 InstanceKlass* method_holder = target->method_holder(); |
1225 if (method_holder_loader() != interface_loader()) { |
1226 if (method_holder_loader() != interface_loader()) { |
1226 ResourceMark rm(THREAD); |
1227 ResourceMark rm(THREAD); |
1227 Symbol* failed_type_symbol = |
1228 Symbol* failed_type_symbol = |
1228 SystemDictionary::check_signature_loaders(m->signature(), |
1229 SystemDictionary::check_signature_loaders(m->signature(), |
1229 method_holder_loader, |
1230 method_holder_loader, |
1238 ss.print("' the class loader %s for super interface %s, and the class" |
1239 ss.print("' the class loader %s for super interface %s, and the class" |
1239 " loader %s of the selected method's %s, %s have" |
1240 " loader %s of the selected method's %s, %s have" |
1240 " different Class objects for the type %s used in the signature (%s; %s)", |
1241 " different Class objects for the type %s used in the signature (%s; %s)", |
1241 interf->class_loader_data()->loader_name_and_id(), |
1242 interf->class_loader_data()->loader_name_and_id(), |
1242 interf->external_name(), |
1243 interf->external_name(), |
1243 target()->method_holder()->class_loader_data()->loader_name_and_id(), |
1244 method_holder->class_loader_data()->loader_name_and_id(), |
1244 target()->method_holder()->external_kind(), |
1245 method_holder->external_kind(), |
1245 target()->method_holder()->external_name(), |
1246 method_holder->external_name(), |
1246 failed_type_symbol->as_klass_external_name(), |
1247 failed_type_symbol->as_klass_external_name(), |
1247 interf->class_in_module_of_loader(false, true), |
1248 interf->class_in_module_of_loader(false, true), |
1248 target()->method_holder()->class_in_module_of_loader(false, true)); |
1249 method_holder->class_in_module_of_loader(false, true)); |
1249 THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string()); |
1250 THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string()); |
1250 } |
1251 } |
1251 } |
1252 } |
1252 } |
1253 } |
1253 |
1254 |
1254 // ime may have moved during GC so recalculate address |
1255 // ime may have moved during GC so recalculate address |
1255 int ime_num = m->itable_index(); |
1256 int ime_num = m->itable_index(); |
1256 assert(ime_num < ime_count, "oob"); |
1257 assert(ime_num < ime_count, "oob"); |
1257 itableOffsetEntry::method_entry(_klass, method_table_offset)[ime_num].initialize(target()); |
1258 itableOffsetEntry::method_entry(_klass, method_table_offset)[ime_num].initialize(target); |
1258 if (log_develop_is_enabled(Trace, itables)) { |
1259 if (log_develop_is_enabled(Trace, itables)) { |
1259 ResourceMark rm(THREAD); |
1260 ResourceMark rm(THREAD); |
1260 if (target() != NULL) { |
1261 if (target != NULL) { |
1261 LogTarget(Trace, itables) lt; |
1262 LogTarget(Trace, itables) lt; |
1262 LogStream ls(lt); |
1263 LogStream ls(lt); |
1263 char* sig = target()->name_and_sig_as_C_string(); |
1264 char* sig = target->name_and_sig_as_C_string(); |
1264 ls.print("interface: %s, ime_num: %d, target: %s, method_holder: %s ", |
1265 ls.print("interface: %s, ime_num: %d, target: %s, method_holder: %s ", |
1265 interf->internal_name(), ime_num, sig, |
1266 interf->internal_name(), ime_num, sig, |
1266 target()->method_holder()->internal_name()); |
1267 target->method_holder()->internal_name()); |
1267 ls.print("target_method flags: "); |
1268 ls.print("target_method flags: "); |
1268 target()->print_linkage_flags(&ls); |
1269 target->print_linkage_flags(&ls); |
1269 ls.cr(); |
1270 ls.cr(); |
1270 } |
1271 } |
1271 } |
1272 } |
1272 } |
1273 } |
1273 } |
1274 } |