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); |