< prev index next >

src/hotspot/share/oops/klassVtable.cpp

Print this page

        

*** 298,308 **** #ifndef PRODUCT Symbol* name= target_method()->name(); Symbol* signature = target_method()->signature(); assert(super_method->name() == name && super_method->signature() == signature, "vtable entry name/sig mismatch"); #endif ! if (supersuperklass->is_override(super_method, target_loader, target_classname, THREAD)) { if (log_develop_is_enabled(Trace, vtables)) { ResourceMark rm(THREAD); LogTarget(Trace, vtables) lt; LogStream ls(lt); char* sig = target_method()->name_and_sig_as_C_string(); --- 298,308 ---- #ifndef PRODUCT Symbol* name= target_method()->name(); Symbol* signature = target_method()->signature(); assert(super_method->name() == name && super_method->signature() == signature, "vtable entry name/sig mismatch"); #endif ! if (supersuperklass->is_override(methodHandle(THREAD, super_method), target_loader, target_classname, THREAD)) { if (log_develop_is_enabled(Trace, vtables)) { ResourceMark rm(THREAD); LogTarget(Trace, vtables) lt; LogStream ls(lt); char* sig = target_method()->name_and_sig_as_C_string();
*** 459,469 **** bool overrides = false; // private methods are also never overridden if (!super_method->is_private() && (is_default ! || ((super_klass->is_override(super_method, target_loader, target_classname, THREAD)) || ((klass->major_version() >= VTABLE_TRANSITIVE_OVERRIDE_VERSION) && ((super_klass = find_transitive_override(super_klass, target_method, i, target_loader, target_classname, THREAD)) != (InstanceKlass*)NULL))))) --- 459,469 ---- bool overrides = false; // private methods are also never overridden if (!super_method->is_private() && (is_default ! || ((super_klass->is_override(methodHandle(THREAD, super_method), target_loader, target_classname, THREAD)) || ((klass->major_version() >= VTABLE_TRANSITIVE_OVERRIDE_VERSION) && ((super_klass = find_transitive_override(super_klass, target_method, i, target_loader, target_classname, THREAD)) != (InstanceKlass*)NULL)))))
*** 648,658 **** // ignore private, c.m pub does override a.m pub // For classes that were not javac'd together, we also do transitive overriding around // methods that have less accessibility if ((!super_method->is_static()) && (!super_method->is_private())) { ! if (superk->is_override(super_method, classloader, classname, THREAD)) { return false; // else keep looking for transitive overrides } // If we get here then one of the super classes has a package private method // that will not get overridden because it is in a different package. But, --- 648,658 ---- // ignore private, c.m pub does override a.m pub // For classes that were not javac'd together, we also do transitive overriding around // methods that have less accessibility if ((!super_method->is_static()) && (!super_method->is_private())) { ! if (superk->is_override(methodHandle(THREAD, super_method), classloader, classname, THREAD)) { return false; // else keep looking for transitive overrides } // If we get here then one of the super classes has a package private method // that will not get overridden because it is in a different package. But,
*** 1195,1205 **** Handle interface_loader (THREAD, interf->class_loader()); int ime_count = method_count_for_interface(interf); for (int i = 0; i < nof_methods; i++) { Method* m = methods->at(i); ! methodHandle target; if (m->has_itable_index()) { // This search must match the runtime resolution, i.e. selection search for invokeinterface // to correctly enforce loader constraints for interface method inheritance. // Private methods are skipped as a private class method can never be the implementation // of an interface method. --- 1195,1205 ---- Handle interface_loader (THREAD, interf->class_loader()); int ime_count = method_count_for_interface(interf); for (int i = 0; i < nof_methods; i++) { Method* m = methods->at(i); ! Method* target = NULL; if (m->has_itable_index()) { // This search must match the runtime resolution, i.e. selection search for invokeinterface // to correctly enforce loader constraints for interface method inheritance. // Private methods are skipped as a private class method can never be the implementation // of an interface method.
*** 1220,1229 **** --- 1220,1230 ---- } else { // Entry did resolve, check loader constraints before initializing // if checkconstraints requested if (checkconstraints) { Handle method_holder_loader (THREAD, target->method_holder()->class_loader()); + InstanceKlass* method_holder = target->method_holder(); if (method_holder_loader() != interface_loader()) { ResourceMark rm(THREAD); Symbol* failed_type_symbol = SystemDictionary::check_signature_loaders(m->signature(), method_holder_loader,
*** 1238,1273 **** ss.print("' the class loader %s for super interface %s, and the class" " loader %s of the selected method's %s, %s have" " different Class objects for the type %s used in the signature (%s; %s)", interf->class_loader_data()->loader_name_and_id(), interf->external_name(), ! target()->method_holder()->class_loader_data()->loader_name_and_id(), ! target()->method_holder()->external_kind(), ! target()->method_holder()->external_name(), failed_type_symbol->as_klass_external_name(), interf->class_in_module_of_loader(false, true), ! target()->method_holder()->class_in_module_of_loader(false, true)); THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string()); } } } // ime may have moved during GC so recalculate address int ime_num = m->itable_index(); assert(ime_num < ime_count, "oob"); ! itableOffsetEntry::method_entry(_klass, method_table_offset)[ime_num].initialize(target()); if (log_develop_is_enabled(Trace, itables)) { ResourceMark rm(THREAD); ! if (target() != NULL) { LogTarget(Trace, itables) lt; LogStream ls(lt); ! char* sig = target()->name_and_sig_as_C_string(); ls.print("interface: %s, ime_num: %d, target: %s, method_holder: %s ", interf->internal_name(), ime_num, sig, ! target()->method_holder()->internal_name()); ls.print("target_method flags: "); ! target()->print_linkage_flags(&ls); ls.cr(); } } } } --- 1239,1274 ---- ss.print("' the class loader %s for super interface %s, and the class" " loader %s of the selected method's %s, %s have" " different Class objects for the type %s used in the signature (%s; %s)", interf->class_loader_data()->loader_name_and_id(), interf->external_name(), ! method_holder->class_loader_data()->loader_name_and_id(), ! method_holder->external_kind(), ! method_holder->external_name(), failed_type_symbol->as_klass_external_name(), interf->class_in_module_of_loader(false, true), ! method_holder->class_in_module_of_loader(false, true)); THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string()); } } } // ime may have moved during GC so recalculate address int ime_num = m->itable_index(); assert(ime_num < ime_count, "oob"); ! itableOffsetEntry::method_entry(_klass, method_table_offset)[ime_num].initialize(target); if (log_develop_is_enabled(Trace, itables)) { ResourceMark rm(THREAD); ! if (target != NULL) { LogTarget(Trace, itables) lt; LogStream ls(lt); ! char* sig = target->name_and_sig_as_C_string(); ls.print("interface: %s, ime_num: %d, target: %s, method_holder: %s ", interf->internal_name(), ime_num, sig, ! target->method_holder()->internal_name()); ls.print("target_method flags: "); ! target->print_linkage_flags(&ls); ls.cr(); } } } }
< prev index next >