< prev index next >

src/share/vm/prims/methodHandles.cpp

Print this page




 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(


< prev index next >