hotspot/src/share/vm/oops/methodOop.cpp
changeset 5420 586d3988e72b
parent 5419 f2e8cc8c12ea
child 5428 246270dac59d
equal deleted inserted replaced
5419:f2e8cc8c12ea 5420:586d3988e72b
   805 
   805 
   806   // caching this method should be just fine
   806   // caching this method should be just fine
   807   return false;
   807   return false;
   808 }
   808 }
   809 
   809 
       
   810 bool methodOopDesc::is_method_handle_invoke_name(vmSymbols::SID name_sid) {
       
   811   switch (name_sid) {
       
   812   case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name):  // FIXME: remove this transitional form
       
   813   case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeExact_name):
       
   814   case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name):
       
   815     return true;
       
   816   }
       
   817   return false;
       
   818 }
       
   819 
   810 // Constant pool structure for invoke methods:
   820 // Constant pool structure for invoke methods:
   811 enum {
   821 enum {
   812   _imcp_invoke_name = 1,        // utf8: 'invoke'
   822   _imcp_invoke_name = 1,        // utf8: 'invokeExact' or 'invokeGeneric'
   813   _imcp_invoke_signature,       // utf8: (variable symbolOop)
   823   _imcp_invoke_signature,       // utf8: (variable symbolOop)
   814   _imcp_method_type_value,      // string: (variable java/dyn/MethodType, sic)
   824   _imcp_method_type_value,      // string: (variable java/dyn/MethodType, sic)
   815   _imcp_limit
   825   _imcp_limit
   816 };
   826 };
   817 
   827 
   837 //------------------------------------------------------------------------------
   847 //------------------------------------------------------------------------------
   838 // methodOopDesc::is_method_handle_adapter
   848 // methodOopDesc::is_method_handle_adapter
   839 //
   849 //
   840 // Tests if this method is an internal adapter frame from the
   850 // Tests if this method is an internal adapter frame from the
   841 // MethodHandleCompiler.
   851 // MethodHandleCompiler.
       
   852 // Must be consistent with MethodHandleCompiler::get_method_oop().
   842 bool methodOopDesc::is_method_handle_adapter() const {
   853 bool methodOopDesc::is_method_handle_adapter() const {
   843   return ((name() == vmSymbols::invoke_name() &&
   854   return (is_method_handle_invoke_name(name()) &&
   844            method_holder() == SystemDictionary::MethodHandle_klass())
   855           is_synthetic() &&
   845           ||
   856           MethodHandleCompiler::klass_is_method_handle_adapter_holder(method_holder()));
   846           method_holder() == SystemDictionary::InvokeDynamic_klass());
       
   847 }
   857 }
   848 
   858 
   849 methodHandle methodOopDesc::make_invoke_method(KlassHandle holder,
   859 methodHandle methodOopDesc::make_invoke_method(KlassHandle holder,
       
   860                                                symbolHandle name,
   850                                                symbolHandle signature,
   861                                                symbolHandle signature,
   851                                                Handle method_type, TRAPS) {
   862                                                Handle method_type, TRAPS) {
   852   methodHandle empty;
   863   methodHandle empty;
   853 
   864 
   854   assert(holder() == SystemDictionary::MethodHandle_klass(),
   865   assert(holder() == SystemDictionary::MethodHandle_klass(),
   863   constantPoolHandle cp;
   874   constantPoolHandle cp;
   864   {
   875   {
   865     constantPoolOop cp_oop = oopFactory::new_constantPool(_imcp_limit, IsSafeConc, CHECK_(empty));
   876     constantPoolOop cp_oop = oopFactory::new_constantPool(_imcp_limit, IsSafeConc, CHECK_(empty));
   866     cp = constantPoolHandle(THREAD, cp_oop);
   877     cp = constantPoolHandle(THREAD, cp_oop);
   867   }
   878   }
   868   cp->symbol_at_put(_imcp_invoke_name,       vmSymbols::invoke_name());
   879   cp->symbol_at_put(_imcp_invoke_name,       name());
   869   cp->symbol_at_put(_imcp_invoke_signature,  signature());
   880   cp->symbol_at_put(_imcp_invoke_signature,  signature());
   870   cp->string_at_put(_imcp_method_type_value, vmSymbols::void_signature());
   881   cp->string_at_put(_imcp_method_type_value, vmSymbols::void_signature());
   871   cp->set_pool_holder(holder());
   882   cp->set_pool_holder(holder());
   872 
   883 
   873   // set up the fancy stuff:
   884   // set up the fancy stuff:
   880     m = methodHandle(THREAD, m_oop);
   891     m = methodHandle(THREAD, m_oop);
   881   }
   892   }
   882   m->set_constants(cp());
   893   m->set_constants(cp());
   883   m->set_name_index(_imcp_invoke_name);
   894   m->set_name_index(_imcp_invoke_name);
   884   m->set_signature_index(_imcp_invoke_signature);
   895   m->set_signature_index(_imcp_invoke_signature);
   885   assert(m->name() == vmSymbols::invoke_name(), "");
   896   assert(is_method_handle_invoke_name(m->name()), "");
   886   assert(m->signature() == signature(), "");
   897   assert(m->signature() == signature(), "");
   887 #ifdef CC_INTERP
   898 #ifdef CC_INTERP
   888   ResultTypeFinder rtf(signature());
   899   ResultTypeFinder rtf(signature());
   889   m->set_result_index(rtf.type());
   900   m->set_result_index(rtf.type());
   890 #endif
   901 #endif
  1031       // pretend it is the corresponding method in the non-strict class:
  1042       // pretend it is the corresponding method in the non-strict class:
  1032       klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math);
  1043       klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math);
  1033       id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
  1044       id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
  1034       break;
  1045       break;
  1035     }
  1046     }
       
  1047     break;
       
  1048 
       
  1049   // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*.
       
  1050   case vmSymbols::VM_SYMBOL_ENUM_NAME(java_dyn_MethodHandle):
       
  1051     if (is_static() || !is_native())  break;
       
  1052     switch (name_id) {
       
  1053     case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name):
       
  1054       id = vmIntrinsics::_invokeGeneric; break;
       
  1055     default:
       
  1056       if (is_method_handle_invoke_name(name()))
       
  1057         id = vmIntrinsics::_invokeExact;
       
  1058       break;
       
  1059     }
       
  1060     break;
       
  1061   case vmSymbols::VM_SYMBOL_ENUM_NAME(java_dyn_InvokeDynamic):
       
  1062     if (!is_static() || !is_native())  break;
       
  1063     id = vmIntrinsics::_invokeDynamic;
       
  1064     break;
  1036   }
  1065   }
  1037 
  1066 
  1038   if (id != vmIntrinsics::_none) {
  1067   if (id != vmIntrinsics::_none) {
  1039     // Set up its iid.  It is an alias method.
  1068     // Set up its iid.  It is an alias method.
  1040     set_intrinsic_id(id);
  1069     set_intrinsic_id(id);