Mercurial > hg > truffle
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); |