src/share/vm/interpreter/linkResolver.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File bug_jdk8033150 Sdiff src/share/vm/interpreter

src/share/vm/interpreter/linkResolver.cpp

Print this page




 226       sel_klass->external_name(),
 227       ref_klass->external_name()
 228     );
 229     return;
 230   }
 231 }
 232 
 233 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
 234   Klass* result_oop = pool->klass_ref_at(index, CHECK);
 235   result = KlassHandle(THREAD, result_oop);
 236 }
 237 
 238 //------------------------------------------------------------------------------------------------------------------------
 239 // Method resolution
 240 //
 241 // According to JVM spec. $5.4.3c & $5.4.3d
 242 
 243 // Look up method in klasses, including static 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) {
 246   Method* result_oop = klass->uncached_lookup_method(name, signature);

 247 
 248   // JDK 8, JVMS 5.4.3.4: Interface method resolution should
 249   // ignore static and non-public methods of java.lang.Object,
 250   // like clone, finalize, registerNatives.
 251   if (in_imethod_resolve &&
 252       result_oop != NULL &&
 253       klass->is_interface() &&
 254       (result_oop->is_static() || !result_oop->is_public()) &&
 255       result_oop->method_holder() == SystemDictionary::Object_klass()) {
 256     result_oop = NULL;
 257   }
 258 






 259   if (result_oop == NULL) {
 260     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
 261     if (default_methods != NULL) {
 262       result_oop = InstanceKlass::find_method(default_methods, name, signature);
 263     }
 264   }
 265 
 266   if (checkpolymorphism && EnableInvokeDynamic && result_oop != NULL) {
 267     vmIntrinsics::ID iid = result_oop->intrinsic_id();
 268     if (MethodHandles::is_signature_polymorphic(iid)) {
 269       // Do not link directly to these.  The VM must produce a synthetic one using lookup_polymorphic_method.
 270       return;
 271     }
 272   }
 273   result = methodHandle(THREAD, result_oop);
 274 }
 275 
 276 // returns first instance method
 277 // 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) {
 279   Method* result_oop = klass->uncached_lookup_method(name, signature);
 280   result = methodHandle(THREAD, result_oop);
 281   while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) {
 282     KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super());
 283     result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature));
 284   }
 285 
 286   if (result.is_null()) {
 287     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
 288     if (default_methods != NULL) {
 289       result = methodHandle(InstanceKlass::find_method(default_methods, name, signature));
 290       assert(result.is_null() || !result->is_static(), "static defaults not allowed");
 291     }
 292   }
 293 }
 294 
 295 int LinkResolver::vtable_index_of_interface_method(KlassHandle klass,
 296                                           methodHandle resolved_method) {
 297 
 298   int vtable_index = Method::invalid_vtable_index;
 299   Symbol* name = resolved_method->name();
 300   Symbol* signature = resolved_method->signature();
 301 
 302   // First check in default method array
 303   if (!resolved_method->is_abstract() &&
 304     (InstanceKlass::cast(klass())->default_methods() != NULL)) {
 305     int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature);
 306     if (index >= 0 ) {
 307       vtable_index = InstanceKlass::cast(klass())->default_vtable_indices()->at(index);
 308     }
 309   }
 310   if (vtable_index == Method::invalid_vtable_index) {
 311     // get vtable_index for miranda methods
 312     ResourceMark rm;
 313     klassVtable *vt = InstanceKlass::cast(klass())->vtable();
 314     vtable_index = vt->index_of_miranda(name, signature);
 315   }
 316   return vtable_index;
 317 }
 318 
 319 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 320   InstanceKlass *ik = InstanceKlass::cast(klass());
 321 
 322   // Specify 'true' in order to skip default methods when searching the
 323   // interfaces.  Function lookup_method_in_klasses() already looked for
 324   // the method in the default methods table.
 325   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, true));




 226       sel_klass->external_name(),
 227       ref_klass->external_name()
 228     );
 229     return;
 230   }
 231 }
 232 
 233 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
 234   Klass* result_oop = pool->klass_ref_at(index, CHECK);
 235   result = KlassHandle(THREAD, result_oop);
 236 }
 237 
 238 //------------------------------------------------------------------------------------------------------------------------
 239 // Method resolution
 240 //
 241 // According to JVM spec. $5.4.3c & $5.4.3d
 242 
 243 // Look up method in klasses, including static 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) {
 246   // Ignore overpasses so statics can be found during resolution
 247   Method* result_oop = klass->uncached_lookup_method(name, signature, true);
 248 
 249   // JDK 8, JVMS 5.4.3.4: Interface method resolution should
 250   // ignore static and non-public methods of java.lang.Object,
 251   // like clone, finalize, registerNatives.
 252   if (in_imethod_resolve &&
 253       result_oop != NULL &&
 254       klass->is_interface() &&
 255       (result_oop->is_static() || !result_oop->is_public()) &&
 256       result_oop->method_holder() == SystemDictionary::Object_klass()) {
 257     result_oop = NULL;
 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 
 266   if (result_oop == NULL) {
 267     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
 268     if (default_methods != NULL) {
 269       result_oop = InstanceKlass::find_method(default_methods, name, signature);
 270     }
 271   }
 272 
 273   if (checkpolymorphism && EnableInvokeDynamic && result_oop != NULL) {
 274     vmIntrinsics::ID iid = result_oop->intrinsic_id();
 275     if (MethodHandles::is_signature_polymorphic(iid)) {
 276       // Do not link directly to these.  The VM must produce a synthetic one using lookup_polymorphic_method.
 277       return;
 278     }
 279   }
 280   result = methodHandle(THREAD, result_oop);
 281 }
 282 
 283 // returns first instance method
 284 // Looks up method in classes, then looks up local default methods
 285 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 286   Method* result_oop = klass->uncached_lookup_method(name, signature, false);
 287   result = methodHandle(THREAD, result_oop);
 288   while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) {
 289     KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super());
 290     result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, false));
 291   }
 292 
 293   if (result.is_null()) {
 294     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
 295     if (default_methods != NULL) {
 296       result = methodHandle(InstanceKlass::find_method(default_methods, name, signature));
 297       assert(result.is_null() || !result->is_static(), "static defaults not allowed");
 298     }
 299   }
 300 }
 301 
 302 int LinkResolver::vtable_index_of_interface_method(KlassHandle klass,
 303                                           methodHandle resolved_method) {
 304 
 305   int vtable_index = Method::invalid_vtable_index;
 306   Symbol* name = resolved_method->name();
 307   Symbol* signature = resolved_method->signature();
 308 
 309   // First check in default method array
 310   if (!resolved_method->is_abstract() &&
 311     (InstanceKlass::cast(klass())->default_methods() != NULL)) {
 312     int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature, false);
 313     if (index >= 0 ) {
 314       vtable_index = InstanceKlass::cast(klass())->default_vtable_indices()->at(index);
 315     }
 316   }
 317   if (vtable_index == Method::invalid_vtable_index) {
 318     // get vtable_index for miranda methods
 319     ResourceMark rm;
 320     klassVtable *vt = InstanceKlass::cast(klass())->vtable();
 321     vtable_index = vt->index_of_miranda(name, signature);
 322   }
 323   return vtable_index;
 324 }
 325 
 326 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 327   InstanceKlass *ik = InstanceKlass::cast(klass());
 328 
 329   // Specify 'true' in order to skip default methods when searching the
 330   // interfaces.  Function lookup_method_in_klasses() already looked for
 331   // the method in the default methods table.
 332   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, true));


src/share/vm/interpreter/linkResolver.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File