Mercurial > hg > graal-jvmci-8
comparison src/share/vm/prims/methodHandles.cpp @ 3442:f7d55ea6ee56
7045514: SPARC assembly code for JSR 292 ricochet frames
Reviewed-by: kvn, jrose
author | never |
---|---|
date | Fri, 03 Jun 2011 22:31:43 -0700 |
parents | ba550512d3b2 |
children | a9b8b43b115f |
comparison
equal
deleted
inserted
replaced
3441:f56542cb325a | 3442:f7d55ea6ee56 |
---|---|
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); |