hotspot/src/share/vm/prims/methodHandles.cpp
changeset 11487 f45d945367d4
parent 10983 9ab65f4cec18
child 13293 c2b4f191c489
equal deleted inserted replaced
11486:cdc636532368 11487:f45d945367d4
   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);