340 for (; ms < me; ms++) { 341 Method* m = iklass->methods()->at(ms); 342 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS; 343 int flags = m->access_flags().as_int(); 344 if ((flags & required) == required && ArgumentCount(m->signature()).size() == 1) { 345 return true; 346 } 347 } 348 return false; 349 } 350 351 352 Symbol* MethodHandles::signature_polymorphic_intrinsic_name(vmIntrinsics::ID iid) { 353 assert(is_signature_polymorphic_intrinsic(iid), "%d %s", iid, vmIntrinsics::name_at(iid)); 354 switch (iid) { 355 case vmIntrinsics::_invokeBasic: return vmSymbols::invokeBasic_name(); 356 case vmIntrinsics::_linkToVirtual: return vmSymbols::linkToVirtual_name(); 357 case vmIntrinsics::_linkToStatic: return vmSymbols::linkToStatic_name(); 358 case vmIntrinsics::_linkToSpecial: return vmSymbols::linkToSpecial_name(); 359 case vmIntrinsics::_linkToInterface: return vmSymbols::linkToInterface_name(); 360 } 361 fatal("unexpected intrinsic id: %d %s", iid, vmIntrinsics::name_at(iid)); 362 return 0; 363 } 364 365 Bytecodes::Code MethodHandles::signature_polymorphic_intrinsic_bytecode(vmIntrinsics::ID id) { 366 switch(id) { 367 case vmIntrinsics::_linkToVirtual: return Bytecodes::_invokevirtual; 368 case vmIntrinsics::_linkToInterface: return Bytecodes::_invokeinterface; 369 case vmIntrinsics::_linkToStatic: return Bytecodes::_invokestatic; 370 case vmIntrinsics::_linkToSpecial: return Bytecodes::_invokespecial; 371 case vmIntrinsics::_invokeBasic: return Bytecodes::_invokehandle; 372 default: 373 fatal("unexpected id: (%d) %s", (uint)id, vmIntrinsics::name_at(id)); 374 return Bytecodes::_illegal; 375 } 376 } 377 378 int MethodHandles::signature_polymorphic_intrinsic_ref_kind(vmIntrinsics::ID iid) { 379 switch (iid) { 380 case vmIntrinsics::_invokeBasic: return 0; 381 case vmIntrinsics::_linkToVirtual: return JVM_REF_invokeVirtual; 382 case vmIntrinsics::_linkToStatic: return JVM_REF_invokeStatic; 383 case vmIntrinsics::_linkToSpecial: return JVM_REF_invokeSpecial; 384 case vmIntrinsics::_linkToInterface: return JVM_REF_invokeInterface; 385 } 386 fatal("unexpected intrinsic id: %d %s", iid, vmIntrinsics::name_at(iid)); 387 return 0; 388 } 389 390 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Symbol* name) { 391 vmSymbols::SID name_id = vmSymbols::find_sid(name); 392 switch (name_id) { 393 // The ID _invokeGeneric stands for all non-static signature-polymorphic methods, except built-ins. 394 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name): return vmIntrinsics::_invokeGeneric; 395 // The only built-in non-static signature-polymorphic method is MethodHandle.invokeBasic: 396 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeBasic_name): return vmIntrinsics::_invokeBasic; 397 398 // There is one static signature-polymorphic method for each JVM invocation mode. 399 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToVirtual_name): return vmIntrinsics::_linkToVirtual; 400 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToStatic_name): return vmIntrinsics::_linkToStatic; 401 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name): return vmIntrinsics::_linkToSpecial; 402 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name): return vmIntrinsics::_linkToInterface; 403 } 404 405 // Cover the case of invokeExact and any future variants of invokeFoo. 406 Klass* mh_klass = SystemDictionary::well_known_klass( 407 SystemDictionary::WK_KLASS_ENUM_NAME(MethodHandle_klass) ); 408 if (mh_klass != NULL && is_method_handle_invoke_name(mh_klass, name)) { 409 return vmIntrinsics::_invokeGeneric; 410 } 411 412 // Cover the case of methods on VarHandle. 413 Klass* vh_klass = SystemDictionary::well_known_klass( 414 SystemDictionary::WK_KLASS_ENUM_NAME(VarHandle_klass) ); 415 if (vh_klass != NULL && is_method_handle_invoke_name(vh_klass, name)) { 416 return vmIntrinsics::_invokeGeneric; 417 } 418 419 // Note: The pseudo-intrinsic _compiledLambdaForm is never linked against. 420 // Instead it is used to mark lambda forms bound to invokehandle or invokedynamic. 421 return vmIntrinsics::_none; 422 } | 340 for (; ms < me; ms++) { 341 Method* m = iklass->methods()->at(ms); 342 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS; 343 int flags = m->access_flags().as_int(); 344 if ((flags & required) == required && ArgumentCount(m->signature()).size() == 1) { 345 return true; 346 } 347 } 348 return false; 349 } 350 351 352 Symbol* MethodHandles::signature_polymorphic_intrinsic_name(vmIntrinsics::ID iid) { 353 assert(is_signature_polymorphic_intrinsic(iid), "%d %s", iid, vmIntrinsics::name_at(iid)); 354 switch (iid) { 355 case vmIntrinsics::_invokeBasic: return vmSymbols::invokeBasic_name(); 356 case vmIntrinsics::_linkToVirtual: return vmSymbols::linkToVirtual_name(); 357 case vmIntrinsics::_linkToStatic: return vmSymbols::linkToStatic_name(); 358 case vmIntrinsics::_linkToSpecial: return vmSymbols::linkToSpecial_name(); 359 case vmIntrinsics::_linkToInterface: return vmSymbols::linkToInterface_name(); 360 default: 361 fatal("unexpected intrinsic id: %d %s", iid, vmIntrinsics::name_at(iid)); 362 return 0; 363 } 364 } 365 366 Bytecodes::Code MethodHandles::signature_polymorphic_intrinsic_bytecode(vmIntrinsics::ID id) { 367 switch(id) { 368 case vmIntrinsics::_linkToVirtual: return Bytecodes::_invokevirtual; 369 case vmIntrinsics::_linkToInterface: return Bytecodes::_invokeinterface; 370 case vmIntrinsics::_linkToStatic: return Bytecodes::_invokestatic; 371 case vmIntrinsics::_linkToSpecial: return Bytecodes::_invokespecial; 372 case vmIntrinsics::_invokeBasic: return Bytecodes::_invokehandle; 373 default: 374 fatal("unexpected id: (%d) %s", (uint)id, vmIntrinsics::name_at(id)); 375 return Bytecodes::_illegal; 376 } 377 } 378 379 int MethodHandles::signature_polymorphic_intrinsic_ref_kind(vmIntrinsics::ID iid) { 380 switch (iid) { 381 case vmIntrinsics::_invokeBasic: return 0; 382 case vmIntrinsics::_linkToVirtual: return JVM_REF_invokeVirtual; 383 case vmIntrinsics::_linkToStatic: return JVM_REF_invokeStatic; 384 case vmIntrinsics::_linkToSpecial: return JVM_REF_invokeSpecial; 385 case vmIntrinsics::_linkToInterface: return JVM_REF_invokeInterface; 386 default: 387 fatal("unexpected intrinsic id: %d %s", iid, vmIntrinsics::name_at(iid)); 388 return 0; 389 } 390 } 391 392 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Symbol* name) { 393 vmSymbols::SID name_id = vmSymbols::find_sid(name); 394 switch (name_id) { 395 // The ID _invokeGeneric stands for all non-static signature-polymorphic methods, except built-ins. 396 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name): return vmIntrinsics::_invokeGeneric; 397 // The only built-in non-static signature-polymorphic method is MethodHandle.invokeBasic: 398 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeBasic_name): return vmIntrinsics::_invokeBasic; 399 400 // There is one static signature-polymorphic method for each JVM invocation mode. 401 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToVirtual_name): return vmIntrinsics::_linkToVirtual; 402 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToStatic_name): return vmIntrinsics::_linkToStatic; 403 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name): return vmIntrinsics::_linkToSpecial; 404 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name): return vmIntrinsics::_linkToInterface; 405 default: break; 406 } 407 408 // Cover the case of invokeExact and any future variants of invokeFoo. 409 Klass* mh_klass = SystemDictionary::well_known_klass( 410 SystemDictionary::WK_KLASS_ENUM_NAME(MethodHandle_klass) ); 411 if (mh_klass != NULL && is_method_handle_invoke_name(mh_klass, name)) { 412 return vmIntrinsics::_invokeGeneric; 413 } 414 415 // Cover the case of methods on VarHandle. 416 Klass* vh_klass = SystemDictionary::well_known_klass( 417 SystemDictionary::WK_KLASS_ENUM_NAME(VarHandle_klass) ); 418 if (vh_klass != NULL && is_method_handle_invoke_name(vh_klass, name)) { 419 return vmIntrinsics::_invokeGeneric; 420 } 421 422 // Note: The pseudo-intrinsic _compiledLambdaForm is never linked against. 423 // Instead it is used to mark lambda forms bound to invokehandle or invokedynamic. 424 return vmIntrinsics::_none; 425 } |