comparison src/share/vm/prims/methodHandles.cpp @ 4970:33df1aeaebbf

Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Mon, 27 Feb 2012 13:10:13 +0100
parents 15d394228cfa
children 56c4f88474b3
comparison
equal deleted inserted replaced
4703:2cfb7fb2dce7 4970:33df1aeaebbf
192 192
193 //------------------------------------------------------------------------------ 193 //------------------------------------------------------------------------------
194 // MethodHandles::generate_adapters 194 // MethodHandles::generate_adapters
195 // 195 //
196 void MethodHandles::generate_adapters() { 196 void MethodHandles::generate_adapters() {
197 #ifdef TARGET_ARCH_NYI_6939861
198 if (FLAG_IS_DEFAULT(UseRicochetFrames)) UseRicochetFrames = false;
199 #endif
200 if (!EnableInvokeDynamic || SystemDictionary::MethodHandle_klass() == NULL) return; 197 if (!EnableInvokeDynamic || SystemDictionary::MethodHandle_klass() == NULL) return;
201 198
202 assert(_adapter_code == NULL, "generate only once"); 199 assert(_adapter_code == NULL, "generate only once");
203 200
204 ResourceMark rm; 201 ResourceMark rm;
228 } 225 }
229 } 226 }
230 } 227 }
231 228
232 229
233 #ifdef TARGET_ARCH_NYI_6939861
234 // these defs belong in methodHandles_<arch>.cpp
235 frame MethodHandles::ricochet_frame_sender(const frame& fr, RegisterMap *map) {
236 ShouldNotCallThis();
237 return fr;
238 }
239 void MethodHandles::ricochet_frame_oops_do(const frame& fr, OopClosure* f, const RegisterMap* reg_map) {
240 ShouldNotCallThis();
241 }
242 #endif //TARGET_ARCH_NYI_6939861
243
244
245 //------------------------------------------------------------------------------ 230 //------------------------------------------------------------------------------
246 // MethodHandles::ek_supported 231 // MethodHandles::ek_supported
247 // 232 //
248 bool MethodHandles::ek_supported(MethodHandles::EntryKind ek) { 233 bool MethodHandles::ek_supported(MethodHandles::EntryKind ek) {
249 MethodHandles::EntryKind ek_orig = MethodHandles::ek_original_kind(ek); 234 MethodHandles::EntryKind ek_orig = MethodHandles::ek_original_kind(ek);
250 switch (ek_orig) { 235 switch (ek_orig) {
251 case _adapter_unused_13: 236 case _adapter_unused_13:
252 return false; // not defined yet 237 return false; // not defined yet
253 case _adapter_prim_to_ref: 238 case _adapter_prim_to_ref:
254 return UseRicochetFrames && conv_op_supported(java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_REF); 239 return conv_op_supported(java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_REF);
255 case _adapter_collect_args: 240 case _adapter_collect_args:
256 return UseRicochetFrames && conv_op_supported(java_lang_invoke_AdapterMethodHandle::OP_COLLECT_ARGS); 241 return conv_op_supported(java_lang_invoke_AdapterMethodHandle::OP_COLLECT_ARGS);
257 case _adapter_fold_args: 242 case _adapter_fold_args:
258 return UseRicochetFrames && conv_op_supported(java_lang_invoke_AdapterMethodHandle::OP_FOLD_ARGS); 243 return conv_op_supported(java_lang_invoke_AdapterMethodHandle::OP_FOLD_ARGS);
259 case _adapter_opt_return_any:
260 return UseRicochetFrames;
261 #ifdef TARGET_ARCH_NYI_6939861
262 // ports before 6939861 supported only three kinds of spread ops
263 case _adapter_spread_args:
264 // restrict spreads to three kinds:
265 switch (ek) {
266 case _adapter_opt_spread_0:
267 case _adapter_opt_spread_1:
268 case _adapter_opt_spread_more:
269 break;
270 default:
271 return false;
272 break;
273 }
274 break;
275 #endif //TARGET_ARCH_NYI_6939861
276 } 244 }
277 return true; 245 return true;
278 } 246 }
279 247
280 248
1986 } 1954 }
1987 break; 1955 break;
1988 case _adapter_prim_to_ref: // boxer MH to use 1956 case _adapter_prim_to_ref: // boxer MH to use
1989 case _adapter_collect_args: // method handle which collects the args 1957 case _adapter_collect_args: // method handle which collects the args
1990 case _adapter_fold_args: // method handle which collects the args 1958 case _adapter_fold_args: // method handle which collects the args
1991 if (!UseRicochetFrames) {
1992 { err = "box/collect/fold operators are not supported"; break; }
1993 }
1994 if (!java_lang_invoke_MethodHandle::is_instance(argument())) 1959 if (!java_lang_invoke_MethodHandle::is_instance(argument()))
1995 { err = "MethodHandle adapter argument required"; break; } 1960 { err = "MethodHandle adapter argument required"; break; }
1996 arg_mtype = Handle(THREAD, java_lang_invoke_MethodHandle::type(argument())); 1961 arg_mtype = Handle(THREAD, java_lang_invoke_MethodHandle::type(argument()));
1997 break; 1962 break;
1998 default: 1963 default:
2368 } 2333 }
2369 break; 2334 break;
2370 2335
2371 case _adapter_prim_to_ref: 2336 case _adapter_prim_to_ref:
2372 { 2337 {
2373 assert(UseRicochetFrames, "else don't come here");
2374 // vminfo will be the location to insert the return value 2338 // vminfo will be the location to insert the return value
2375 vminfo = argslot; 2339 vminfo = argslot;
2376 ek_opt = _adapter_opt_collect_ref; 2340 ek_opt = _adapter_opt_collect_ref;
2377 ensure_vmlayout_field(target, CHECK); 2341 ensure_vmlayout_field(target, CHECK);
2378 // for MethodHandleWalk: 2342 // for MethodHandleWalk:
2434 } 2398 }
2435 break; 2399 break;
2436 2400
2437 case _adapter_spread_args: 2401 case _adapter_spread_args:
2438 { 2402 {
2439 #ifdef TARGET_ARCH_NYI_6939861
2440 // ports before 6939861 supported only three kinds of spread ops
2441 if (!UseRicochetFrames) {
2442 int array_size = slots_pushed + 1;
2443 assert(array_size >= 0, "");
2444 vminfo = array_size;
2445 switch (array_size) {
2446 case 0: ek_opt = _adapter_opt_spread_0; break;
2447 case 1: ek_opt = _adapter_opt_spread_1; break;
2448 default: ek_opt = _adapter_opt_spread_more; break;
2449 }
2450 break;
2451 }
2452 #endif //TARGET_ARCH_NYI_6939861
2453 // vminfo will be the required length of the array 2403 // vminfo will be the required length of the array
2454 int array_size = (slots_pushed + 1) / (type2size[dest] == 2 ? 2 : 1); 2404 int array_size = (slots_pushed + 1) / (type2size[dest] == 2 ? 2 : 1);
2455 vminfo = array_size; 2405 vminfo = array_size;
2456 // general case 2406 // general case
2457 switch (dest) { 2407 switch (dest) {
2492 } 2442 }
2493 break; 2443 break;
2494 2444
2495 case _adapter_collect_args: 2445 case _adapter_collect_args:
2496 { 2446 {
2497 assert(UseRicochetFrames, "else don't come here");
2498 int elem_slots = argument_slot_count(java_lang_invoke_MethodHandle::type(argument())); 2447 int elem_slots = argument_slot_count(java_lang_invoke_MethodHandle::type(argument()));
2499 // vminfo will be the location to insert the return value 2448 // vminfo will be the location to insert the return value
2500 vminfo = argslot; 2449 vminfo = argslot;
2501 ensure_vmlayout_field(target, CHECK); 2450 ensure_vmlayout_field(target, CHECK);
2502 ensure_vmlayout_field(argument, CHECK); 2451 ensure_vmlayout_field(argument, CHECK);
2561 break; 2510 break;
2562 } 2511 }
2563 2512
2564 case _adapter_fold_args: 2513 case _adapter_fold_args:
2565 { 2514 {
2566 assert(UseRicochetFrames, "else don't come here");
2567 int elem_slots = argument_slot_count(java_lang_invoke_MethodHandle::type(argument())); 2515 int elem_slots = argument_slot_count(java_lang_invoke_MethodHandle::type(argument()));
2568 // vminfo will be the location to insert the return value 2516 // vminfo will be the location to insert the return value
2569 vminfo = argslot + elem_slots; 2517 vminfo = argslot + elem_slots;
2570 ensure_vmlayout_field(target, CHECK); 2518 ensure_vmlayout_field(target, CHECK);
2571 ensure_vmlayout_field(argument, CHECK); 2519 ensure_vmlayout_field(argument, CHECK);