comparison src/share/vm/prims/methodHandles.cpp @ 3753:cba7b5c2d53f

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 60b8287df30e
children a9b8b43b115f
comparison
equal deleted inserted replaced
3752:f918d6096e23 3753:cba7b5c2d53f
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);