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)); |