< prev index next >

src/share/vm/prims/methodHandles.cpp

Print this page




 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 }


< prev index next >