src/hotspot/share/oops/klassVtable.cpp
changeset 59056 15936b142f86
parent 58575 6941d77417f4
equal deleted inserted replaced
59055:57ad70bcf06c 59056:15936b142f86
   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   }