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