hotspot/src/share/vm/interpreter/linkResolver.cpp
changeset 23999 22eb7be3d99d
parent 22739 74105c330330
child 24322 c2978d1578e3
equal deleted inserted replaced
23998:418ac4fe9834 23999:22eb7be3d99d
   241 // According to JVM spec. $5.4.3c & $5.4.3d
   241 // According to JVM spec. $5.4.3c & $5.4.3d
   242 
   242 
   243 // Look up method in klasses, including static methods
   243 // Look up method in klasses, including static methods
   244 // Then look up local default methods
   244 // Then look up local default methods
   245 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS) {
   245 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS) {
   246   Method* result_oop = klass->uncached_lookup_method(name, signature);
   246   // Ignore overpasses so statics can be found during resolution
       
   247   Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::skip_overpass);
   247 
   248 
   248   // JDK 8, JVMS 5.4.3.4: Interface method resolution should
   249   // JDK 8, JVMS 5.4.3.4: Interface method resolution should
   249   // ignore static and non-public methods of java.lang.Object,
   250   // ignore static and non-public methods of java.lang.Object,
   250   // like clone, finalize, registerNatives.
   251   // like clone, finalize, registerNatives.
   251   if (in_imethod_resolve &&
   252   if (in_imethod_resolve &&
   254       (result_oop->is_static() || !result_oop->is_public()) &&
   255       (result_oop->is_static() || !result_oop->is_public()) &&
   255       result_oop->method_holder() == SystemDictionary::Object_klass()) {
   256       result_oop->method_holder() == SystemDictionary::Object_klass()) {
   256     result_oop = NULL;
   257     result_oop = NULL;
   257   }
   258   }
   258 
   259 
       
   260   // Before considering default methods, check for an overpass in the
       
   261   // current class if a method has not been found.
       
   262   if (result_oop == NULL) {
       
   263     result_oop = InstanceKlass::cast(klass())->find_method(name, signature);
       
   264   }
       
   265 
   259   if (result_oop == NULL) {
   266   if (result_oop == NULL) {
   260     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
   267     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
   261     if (default_methods != NULL) {
   268     if (default_methods != NULL) {
   262       result_oop = InstanceKlass::find_method(default_methods, name, signature);
   269       result_oop = InstanceKlass::find_method(default_methods, name, signature);
   263     }
   270     }
   274 }
   281 }
   275 
   282 
   276 // returns first instance method
   283 // returns first instance method
   277 // Looks up method in classes, then looks up local default methods
   284 // Looks up method in classes, then looks up local default methods
   278 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
   285 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
   279   Method* result_oop = klass->uncached_lookup_method(name, signature);
   286   Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::normal);
   280   result = methodHandle(THREAD, result_oop);
   287   result = methodHandle(THREAD, result_oop);
   281   while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) {
   288   while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) {
   282     KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super());
   289     KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super());
   283     result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature));
   290     result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, Klass::normal));
   284   }
   291   }
   285 
   292 
   286   if (result.is_null()) {
   293   if (result.is_null()) {
   287     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
   294     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
   288     if (default_methods != NULL) {
   295     if (default_methods != NULL) {
   300   Symbol* signature = resolved_method->signature();
   307   Symbol* signature = resolved_method->signature();
   301 
   308 
   302   // First check in default method array
   309   // First check in default method array
   303   if (!resolved_method->is_abstract() &&
   310   if (!resolved_method->is_abstract() &&
   304     (InstanceKlass::cast(klass())->default_methods() != NULL)) {
   311     (InstanceKlass::cast(klass())->default_methods() != NULL)) {
   305     int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature);
   312     int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature, false);
   306     if (index >= 0 ) {
   313     if (index >= 0 ) {
   307       vtable_index = InstanceKlass::cast(klass())->default_vtable_indices()->at(index);
   314       vtable_index = InstanceKlass::cast(klass())->default_vtable_indices()->at(index);
   308     }
   315     }
   309   }
   316   }
   310   if (vtable_index == Method::invalid_vtable_index) {
   317   if (vtable_index == Method::invalid_vtable_index) {
   320   InstanceKlass *ik = InstanceKlass::cast(klass());
   327   InstanceKlass *ik = InstanceKlass::cast(klass());
   321 
   328 
   322   // Specify 'true' in order to skip default methods when searching the
   329   // Specify 'true' in order to skip default methods when searching the
   323   // interfaces.  Function lookup_method_in_klasses() already looked for
   330   // interfaces.  Function lookup_method_in_klasses() already looked for
   324   // the method in the default methods table.
   331   // the method in the default methods table.
   325   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, true));
   332   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, Klass::skip_defaults));
   326 }
   333 }
   327 
   334 
   328 void LinkResolver::lookup_polymorphic_method(methodHandle& result,
   335 void LinkResolver::lookup_polymorphic_method(methodHandle& result,
   329                                              KlassHandle klass, Symbol* name, Symbol* full_signature,
   336                                              KlassHandle klass, Symbol* name, Symbol* full_signature,
   330                                              KlassHandle current_klass,
   337                                              KlassHandle current_klass,