328 // * It has a return type of Object. 329 // * It has the ACC_VARARGS and ACC_NATIVE flags set. 330 bool MethodHandles::is_method_handle_invoke_name(Klass* klass, Symbol* name) { 331 if (klass == NULL) 332 return false; 333 // The following test will fail spuriously during bootstrap of MethodHandle itself: 334 // if (klass != SystemDictionary::MethodHandle_klass()) 335 // Test the name instead: 336 if (klass->name() != vmSymbols::java_lang_invoke_MethodHandle()) 337 return false; 338 Symbol* poly_sig = vmSymbols::object_array_object_signature(); 339 Method* m = InstanceKlass::cast(klass)->find_method(name, poly_sig); 340 if (m == NULL) return false; 341 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS; 342 int flags = m->access_flags().as_int(); 343 return (flags & required) == required; 344 } 345 346 347 Symbol* MethodHandles::signature_polymorphic_intrinsic_name(vmIntrinsics::ID iid) { 348 assert(is_signature_polymorphic_intrinsic(iid), err_msg("iid=%d", iid)); 349 switch (iid) { 350 case vmIntrinsics::_invokeBasic: return vmSymbols::invokeBasic_name(); 351 case vmIntrinsics::_linkToVirtual: return vmSymbols::linkToVirtual_name(); 352 case vmIntrinsics::_linkToStatic: return vmSymbols::linkToStatic_name(); 353 case vmIntrinsics::_linkToSpecial: return vmSymbols::linkToSpecial_name(); 354 case vmIntrinsics::_linkToInterface: return vmSymbols::linkToInterface_name(); 355 } 356 assert(false, ""); 357 return 0; 358 } 359 360 int MethodHandles::signature_polymorphic_intrinsic_ref_kind(vmIntrinsics::ID iid) { 361 switch (iid) { 362 case vmIntrinsics::_invokeBasic: return 0; 363 case vmIntrinsics::_linkToVirtual: return JVM_REF_invokeVirtual; 364 case vmIntrinsics::_linkToStatic: return JVM_REF_invokeStatic; 365 case vmIntrinsics::_linkToSpecial: return JVM_REF_invokeSpecial; 366 case vmIntrinsics::_linkToInterface: return JVM_REF_invokeInterface; 367 } 368 assert(false, err_msg("iid=%d", iid)); 369 return 0; 370 } 371 372 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Symbol* name) { 373 vmSymbols::SID name_id = vmSymbols::find_sid(name); 374 switch (name_id) { 375 // The ID _invokeGeneric stands for all non-static signature-polymorphic methods, except built-ins. 376 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name): return vmIntrinsics::_invokeGeneric; 377 // The only built-in non-static signature-polymorphic method is MethodHandle.invokeBasic: 378 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeBasic_name): return vmIntrinsics::_invokeBasic; 379 380 // There is one static signature-polymorphic method for each JVM invocation mode. 381 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToVirtual_name): return vmIntrinsics::_linkToVirtual; 382 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToStatic_name): return vmIntrinsics::_linkToStatic; 383 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name): return vmIntrinsics::_linkToSpecial; 384 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name): return vmIntrinsics::_linkToInterface; 385 } 386 387 // Cover the case of invokeExact and any future variants of invokeFoo. 388 Klass* mh_klass = SystemDictionary::well_known_klass( | 328 // * It has a return type of Object. 329 // * It has the ACC_VARARGS and ACC_NATIVE flags set. 330 bool MethodHandles::is_method_handle_invoke_name(Klass* klass, Symbol* name) { 331 if (klass == NULL) 332 return false; 333 // The following test will fail spuriously during bootstrap of MethodHandle itself: 334 // if (klass != SystemDictionary::MethodHandle_klass()) 335 // Test the name instead: 336 if (klass->name() != vmSymbols::java_lang_invoke_MethodHandle()) 337 return false; 338 Symbol* poly_sig = vmSymbols::object_array_object_signature(); 339 Method* m = InstanceKlass::cast(klass)->find_method(name, poly_sig); 340 if (m == NULL) return false; 341 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS; 342 int flags = m->access_flags().as_int(); 343 return (flags & required) == required; 344 } 345 346 347 Symbol* MethodHandles::signature_polymorphic_intrinsic_name(vmIntrinsics::ID iid) { 348 assert(is_signature_polymorphic_intrinsic(iid), err_msg("%d %s", iid, vmIntrinsics::name_at(iid))); 349 switch (iid) { 350 case vmIntrinsics::_invokeBasic: return vmSymbols::invokeBasic_name(); 351 case vmIntrinsics::_linkToVirtual: return vmSymbols::linkToVirtual_name(); 352 case vmIntrinsics::_linkToStatic: return vmSymbols::linkToStatic_name(); 353 case vmIntrinsics::_linkToSpecial: return vmSymbols::linkToSpecial_name(); 354 case vmIntrinsics::_linkToInterface: return vmSymbols::linkToInterface_name(); 355 } 356 fatal(err_msg("unexpected intrinsic id: %d %s", iid, vmIntrinsics::name_at(iid))); 357 return 0; 358 } 359 360 int MethodHandles::signature_polymorphic_intrinsic_ref_kind(vmIntrinsics::ID iid) { 361 switch (iid) { 362 case vmIntrinsics::_invokeBasic: return 0; 363 case vmIntrinsics::_linkToVirtual: return JVM_REF_invokeVirtual; 364 case vmIntrinsics::_linkToStatic: return JVM_REF_invokeStatic; 365 case vmIntrinsics::_linkToSpecial: return JVM_REF_invokeSpecial; 366 case vmIntrinsics::_linkToInterface: return JVM_REF_invokeInterface; 367 } 368 fatal(err_msg("unexpected intrinsic id: %d %s", iid, vmIntrinsics::name_at(iid))); 369 return 0; 370 } 371 372 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Symbol* name) { 373 vmSymbols::SID name_id = vmSymbols::find_sid(name); 374 switch (name_id) { 375 // The ID _invokeGeneric stands for all non-static signature-polymorphic methods, except built-ins. 376 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name): return vmIntrinsics::_invokeGeneric; 377 // The only built-in non-static signature-polymorphic method is MethodHandle.invokeBasic: 378 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeBasic_name): return vmIntrinsics::_invokeBasic; 379 380 // There is one static signature-polymorphic method for each JVM invocation mode. 381 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToVirtual_name): return vmIntrinsics::_linkToVirtual; 382 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToStatic_name): return vmIntrinsics::_linkToStatic; 383 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name): return vmIntrinsics::_linkToSpecial; 384 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name): return vmIntrinsics::_linkToInterface; 385 } 386 387 // Cover the case of invokeExact and any future variants of invokeFoo. 388 Klass* mh_klass = SystemDictionary::well_known_klass( |