hotspot/src/share/vm/prims/methodHandles.hpp
changeset 8676 9098d4e927e1
parent 8076 96d498ec7ae1
child 9323 20cc2230dc8a
equal deleted inserted replaced
8675:e9fef2a9bef7 8676:9098d4e927e1
    35 class Label;
    35 class Label;
    36 class MethodHandleEntry;
    36 class MethodHandleEntry;
    37 
    37 
    38 class MethodHandles: AllStatic {
    38 class MethodHandles: AllStatic {
    39   // JVM support for MethodHandle, MethodType, and related types
    39   // JVM support for MethodHandle, MethodType, and related types
    40   // in java.dyn and java.dyn.hotspot.
    40   // in java.lang.invoke and sun.invoke.
    41   // See also  javaClasses for layouts java_dyn_Method{Handle,Type,Type::Form}.
    41   // See also  javaClasses for layouts java_lang_invoke_Method{Handle,Type,Type::Form}.
    42  public:
    42  public:
    43   enum EntryKind {
    43   enum EntryKind {
    44     _raise_exception,           // stub for error generation from other stubs
    44     _raise_exception,           // stub for error generation from other stubs
    45     _invokestatic_mh,           // how a MH emulates invokestatic
    45     _invokestatic_mh,           // how a MH emulates invokestatic
    46     _invokespecial_mh,          // ditto for the other invokes...
    46     _invokespecial_mh,          // ditto for the other invokes...
    52     _bound_ref_direct_mh,       // same as above, with direct linkage to methodOop
    52     _bound_ref_direct_mh,       // same as above, with direct linkage to methodOop
    53     _bound_int_direct_mh,
    53     _bound_int_direct_mh,
    54     _bound_long_direct_mh,
    54     _bound_long_direct_mh,
    55 
    55 
    56     _adapter_mh_first,     // adapter sequence goes here...
    56     _adapter_mh_first,     // adapter sequence goes here...
    57     _adapter_retype_only   = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_RETYPE_ONLY,
    57     _adapter_retype_only   = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY,
    58     _adapter_retype_raw    = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_RETYPE_RAW,
    58     _adapter_retype_raw    = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW,
    59     _adapter_check_cast    = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_CHECK_CAST,
    59     _adapter_check_cast    = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST,
    60     _adapter_prim_to_prim  = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_PRIM_TO_PRIM,
    60     _adapter_prim_to_prim  = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM,
    61     _adapter_ref_to_prim   = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_REF_TO_PRIM,
    61     _adapter_ref_to_prim   = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM,
    62     _adapter_prim_to_ref   = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_PRIM_TO_REF,
    62     _adapter_prim_to_ref   = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_REF,
    63     _adapter_swap_args     = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_SWAP_ARGS,
    63     _adapter_swap_args     = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_SWAP_ARGS,
    64     _adapter_rot_args      = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_ROT_ARGS,
    64     _adapter_rot_args      = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_ROT_ARGS,
    65     _adapter_dup_args      = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_DUP_ARGS,
    65     _adapter_dup_args      = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_DUP_ARGS,
    66     _adapter_drop_args     = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_DROP_ARGS,
    66     _adapter_drop_args     = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_DROP_ARGS,
    67     _adapter_collect_args  = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_COLLECT_ARGS,
    67     _adapter_collect_args  = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_COLLECT_ARGS,
    68     _adapter_spread_args   = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_SPREAD_ARGS,
    68     _adapter_spread_args   = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_SPREAD_ARGS,
    69     _adapter_flyby         = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_FLYBY,
    69     _adapter_flyby         = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_FLYBY,
    70     _adapter_ricochet      = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_RICOCHET,
    70     _adapter_ricochet      = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_RICOCHET,
    71     _adapter_mh_last       = _adapter_mh_first + sun_dyn_AdapterMethodHandle::CONV_OP_LIMIT - 1,
    71     _adapter_mh_last       = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::CONV_OP_LIMIT - 1,
    72 
    72 
    73     // Optimized adapter types
    73     // Optimized adapter types
    74 
    74 
    75     // argument list reordering
    75     // argument list reordering
    76     _adapter_opt_swap_1,
    76     _adapter_opt_swap_1,
   105  public:
   105  public:
   106   static bool enabled()                         { return _enabled; }
   106   static bool enabled()                         { return _enabled; }
   107   static void set_enabled(bool z);
   107   static void set_enabled(bool z);
   108 
   108 
   109  private:
   109  private:
   110   enum {  // import sun_dyn_AdapterMethodHandle::CONV_OP_*
   110   enum {  // import java_lang_invoke_AdapterMethodHandle::CONV_OP_*
   111     CONV_OP_LIMIT         = sun_dyn_AdapterMethodHandle::CONV_OP_LIMIT,
   111     CONV_OP_LIMIT         = java_lang_invoke_AdapterMethodHandle::CONV_OP_LIMIT,
   112     CONV_OP_MASK          = sun_dyn_AdapterMethodHandle::CONV_OP_MASK,
   112     CONV_OP_MASK          = java_lang_invoke_AdapterMethodHandle::CONV_OP_MASK,
   113     CONV_VMINFO_MASK      = sun_dyn_AdapterMethodHandle::CONV_VMINFO_MASK,
   113     CONV_VMINFO_MASK      = java_lang_invoke_AdapterMethodHandle::CONV_VMINFO_MASK,
   114     CONV_VMINFO_SHIFT     = sun_dyn_AdapterMethodHandle::CONV_VMINFO_SHIFT,
   114     CONV_VMINFO_SHIFT     = java_lang_invoke_AdapterMethodHandle::CONV_VMINFO_SHIFT,
   115     CONV_OP_SHIFT         = sun_dyn_AdapterMethodHandle::CONV_OP_SHIFT,
   115     CONV_OP_SHIFT         = java_lang_invoke_AdapterMethodHandle::CONV_OP_SHIFT,
   116     CONV_DEST_TYPE_SHIFT  = sun_dyn_AdapterMethodHandle::CONV_DEST_TYPE_SHIFT,
   116     CONV_DEST_TYPE_SHIFT  = java_lang_invoke_AdapterMethodHandle::CONV_DEST_TYPE_SHIFT,
   117     CONV_SRC_TYPE_SHIFT   = sun_dyn_AdapterMethodHandle::CONV_SRC_TYPE_SHIFT,
   117     CONV_SRC_TYPE_SHIFT   = java_lang_invoke_AdapterMethodHandle::CONV_SRC_TYPE_SHIFT,
   118     CONV_STACK_MOVE_SHIFT = sun_dyn_AdapterMethodHandle::CONV_STACK_MOVE_SHIFT,
   118     CONV_STACK_MOVE_SHIFT = java_lang_invoke_AdapterMethodHandle::CONV_STACK_MOVE_SHIFT,
   119     CONV_STACK_MOVE_MASK  = sun_dyn_AdapterMethodHandle::CONV_STACK_MOVE_MASK
   119     CONV_STACK_MOVE_MASK  = java_lang_invoke_AdapterMethodHandle::CONV_STACK_MOVE_MASK
   120   };
   120   };
   121 
   121 
   122   static bool _enabled;
   122   static bool _enabled;
   123   static MethodHandleEntry* _entries[_EK_LIMIT];
   123   static MethodHandleEntry* _entries[_EK_LIMIT];
   124   static const char*        _entry_names[_EK_LIMIT+1];
   124   static const char*        _entry_names[_EK_LIMIT+1];
   469 
   469 
   470   static Symbol* convert_to_signature(oop type_str, bool polymorphic, TRAPS);
   470   static Symbol* convert_to_signature(oop type_str, bool polymorphic, TRAPS);
   471 };
   471 };
   472 
   472 
   473 
   473 
   474 // Access methods for the "entry" field of a java.dyn.MethodHandle.
   474 // Access methods for the "entry" field of a java.lang.invoke.MethodHandle.
   475 // The field is primarily a jump target for compiled calls.
   475 // The field is primarily a jump target for compiled calls.
   476 // However, we squirrel away some nice pointers for other uses,
   476 // However, we squirrel away some nice pointers for other uses,
   477 // just before the jump target.
   477 // just before the jump target.
   478 // Aspects of a method handle entry:
   478 // Aspects of a method handle entry:
   479 //  - from_compiled_entry - stub used when compiled code calls the MH
   479 //  - from_compiled_entry - stub used when compiled code calls the MH