hotspot/src/share/vm/prims/methodHandles.cpp
changeset 9976 6fef34e63df1
parent 9967 9ddc1c490930
child 9980 a330de5dea17
equal deleted inserted replaced
9975:82190b49ce14 9976:6fef34e63df1
   158 
   158 
   159   NULL
   159   NULL
   160 };
   160 };
   161 
   161 
   162 // Adapters.
   162 // Adapters.
   163 MethodHandlesAdapterBlob* MethodHandles::_adapter_code      = NULL;
   163 MethodHandlesAdapterBlob* MethodHandles::_adapter_code = NULL;
   164 int                       MethodHandles::_adapter_code_size = StubRoutines::method_handles_adapters_code_size;
       
   165 
   164 
   166 jobject MethodHandles::_raise_exception_method;
   165 jobject MethodHandles::_raise_exception_method;
   167 
   166 
   168 address MethodHandles::_adapter_return_handlers[CONV_TYPE_MASK+1];
   167 address MethodHandles::_adapter_return_handlers[CONV_TYPE_MASK+1];
   169 
   168 
   198 
   197 
   199   assert(_adapter_code == NULL, "generate only once");
   198   assert(_adapter_code == NULL, "generate only once");
   200 
   199 
   201   ResourceMark rm;
   200   ResourceMark rm;
   202   TraceTime timer("MethodHandles adapters generation", TraceStartupTime);
   201   TraceTime timer("MethodHandles adapters generation", TraceStartupTime);
   203   _adapter_code = MethodHandlesAdapterBlob::create(_adapter_code_size);
   202   _adapter_code = MethodHandlesAdapterBlob::create(adapter_code_size);
   204   if (_adapter_code == NULL)
   203   if (_adapter_code == NULL)
   205     vm_exit_out_of_memory(_adapter_code_size, "CodeCache: no room for MethodHandles adapters");
   204     vm_exit_out_of_memory(adapter_code_size, "CodeCache: no room for MethodHandles adapters");
   206   CodeBuffer code(_adapter_code);
   205   CodeBuffer code(_adapter_code);
   207   MethodHandlesAdapterGenerator g(&code);
   206   MethodHandlesAdapterGenerator g(&code);
   208   g.generate();
   207   g.generate();
       
   208 
       
   209   // Transfer code comments
       
   210   _adapter_code->set_comments(code.comments());
   209 }
   211 }
   210 
   212 
   211 //------------------------------------------------------------------------------
   213 //------------------------------------------------------------------------------
   212 // MethodHandlesAdapterGenerator::generate
   214 // MethodHandlesAdapterGenerator::generate
   213 //
   215 //
  1719   java_lang_invoke_MethodHandle::set_vmentry(mh(), MethodHandles::entry(MethodHandles::_bound_ref_direct_mh));
  1721   java_lang_invoke_MethodHandle::set_vmentry(mh(), MethodHandles::entry(MethodHandles::_bound_ref_direct_mh));
  1720 }
  1722 }
  1721 
  1723 
  1722 void MethodHandles::verify_BoundMethodHandle(Handle mh, Handle target, int argnum,
  1724 void MethodHandles::verify_BoundMethodHandle(Handle mh, Handle target, int argnum,
  1723                                              bool direct_to_method, TRAPS) {
  1725                                              bool direct_to_method, TRAPS) {
       
  1726   ResourceMark rm;
  1724   Handle ptype_handle(THREAD,
  1727   Handle ptype_handle(THREAD,
  1725                            java_lang_invoke_MethodType::ptype(java_lang_invoke_MethodHandle::type(target()), argnum));
  1728                            java_lang_invoke_MethodType::ptype(java_lang_invoke_MethodHandle::type(target()), argnum));
  1726   KlassHandle ptype_klass;
  1729   KlassHandle ptype_klass;
  1727   BasicType ptype = java_lang_Class::as_BasicType(ptype_handle(), &ptype_klass);
  1730   BasicType ptype = java_lang_Class::as_BasicType(ptype_handle(), &ptype_klass);
  1728   int slots_pushed = type2size[ptype];
  1731   int slots_pushed = type2size[ptype];
  1882   jio_snprintf(msg, sizeof(msg), "bad adapter (conversion=0x%08x): %s", conversion, err);
  1885   jio_snprintf(msg, sizeof(msg), "bad adapter (conversion=0x%08x): %s", conversion, err);
  1883   THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), msg);
  1886   THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), msg);
  1884 }
  1887 }
  1885 
  1888 
  1886 void MethodHandles::verify_AdapterMethodHandle(Handle mh, int argnum, TRAPS) {
  1889 void MethodHandles::verify_AdapterMethodHandle(Handle mh, int argnum, TRAPS) {
       
  1890   ResourceMark rm;
  1887   jint conversion = java_lang_invoke_AdapterMethodHandle::conversion(mh());
  1891   jint conversion = java_lang_invoke_AdapterMethodHandle::conversion(mh());
  1888   int  argslot    = java_lang_invoke_AdapterMethodHandle::vmargslot(mh());
  1892   int  argslot    = java_lang_invoke_AdapterMethodHandle::vmargslot(mh());
  1889 
  1893 
  1890   verify_vmargslot(mh, argnum, argslot, CHECK);
  1894   verify_vmargslot(mh, argnum, argslot, CHECK);
  1891   verify_vmslots(mh, CHECK);
  1895   verify_vmslots(mh, CHECK);
  1985         int src_slot   = argslot;
  1989         int src_slot   = argslot;
  1986         int dest_slot  = vminfo;
  1990         int dest_slot  = vminfo;
  1987         bool rotate_up = (src_slot > dest_slot); // upward rotation
  1991         bool rotate_up = (src_slot > dest_slot); // upward rotation
  1988         int src_arg    = argnum;
  1992         int src_arg    = argnum;
  1989         int dest_arg   = argument_slot_to_argnum(dst_mtype(), dest_slot);
  1993         int dest_arg   = argument_slot_to_argnum(dst_mtype(), dest_slot);
  1990         verify_vmargslot(mh, dest_arg, dest_slot, CHECK);
  1994         verify_vmargslot(target, dest_arg, dest_slot, CHECK);
  1991         if (!(dest_slot >= src_slot + swap_size) &&
  1995         if (!(dest_slot >= src_slot + swap_size) &&
  1992             !(src_slot >= dest_slot + swap_size)) {
  1996             !(src_slot >= dest_slot + swap_size)) {
  1993           err = "source, destination slots must be distinct";
  1997           err = "source, destination slots must be distinct";
  1994         } else if (ek == _adapter_swap_args && !(src_slot > dest_slot)) {
  1998         } else if (ek == _adapter_swap_args && !(src_slot > dest_slot)) {
  1995           err = "source of swap must be deeper in stack";
  1999           err = "source of swap must be deeper in stack";
  2561       break;
  2565       break;
  2562     }
  2566     }
  2563   }
  2567   }
  2564 
  2568 
  2565   if (err != NULL) {
  2569   if (err != NULL) {
  2566     throw_InternalError_for_bad_conversion(conversion, err, THREAD);
  2570     throw_InternalError_for_bad_conversion(conversion, err_msg("%s: conv_op %d ek_opt %d", err, conv_op, ek_opt), THREAD);
  2567     return;
  2571     return;
  2568   }
  2572   }
  2569 
  2573 
  2570   // Rebuild the conversion value; maybe parts of it were changed.
  2574   // Rebuild the conversion value; maybe parts of it were changed.
  2571   jint new_conversion = adapter_conversion(conv_op, src, dest, stack_move, vminfo);
  2575   jint new_conversion = adapter_conversion(conv_op, src, dest, stack_move, vminfo);