hotspot/src/share/vm/interpreter/linkResolver.hpp
changeset 13929 8da0dc50a6e4
parent 13728 882756847a04
child 20017 81eba62e9048
equal deleted inserted replaced
13918:b01a48301e67 13929:8da0dc50a6e4
    74   KlassHandle  _selected_klass;         // dynamic receiver class (same as static, or subklass)
    74   KlassHandle  _selected_klass;         // dynamic receiver class (same as static, or subklass)
    75   methodHandle _resolved_method;        // static target method
    75   methodHandle _resolved_method;        // static target method
    76   methodHandle _selected_method;        // dynamic (actual) target method
    76   methodHandle _selected_method;        // dynamic (actual) target method
    77   int          _vtable_index;           // vtable index of selected method
    77   int          _vtable_index;           // vtable index of selected method
    78   Handle       _resolved_appendix;      // extra argument in constant pool (if CPCE::has_appendix)
    78   Handle       _resolved_appendix;      // extra argument in constant pool (if CPCE::has_appendix)
       
    79   Handle       _resolved_method_type;   // MethodType (for invokedynamic and invokehandle call sites)
    79 
    80 
    80   void         set_static(   KlassHandle resolved_klass,                             methodHandle resolved_method                                                , TRAPS);
    81   void         set_static(   KlassHandle resolved_klass,                             methodHandle resolved_method                                                       , TRAPS);
    81   void         set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method                  , TRAPS);
    82   void         set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method                         , TRAPS);
    82   void         set_virtual(  KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS);
    83   void         set_virtual(  KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index       , TRAPS);
    83   void         set_handle(                                                           methodHandle resolved_method,   Handle resolved_appendix,                     TRAPS);
    84   void         set_handle(                                                           methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS);
    84   void         set_common(   KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS);
    85   void         set_common(   KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index       , TRAPS);
    85 
    86 
    86   friend class LinkResolver;
    87   friend class LinkResolver;
    87 
    88 
    88  public:
    89  public:
    89   KlassHandle  resolved_klass() const            { return _resolved_klass; }
    90   KlassHandle  resolved_klass() const            { return _resolved_klass; }
    90   KlassHandle  selected_klass() const            { return _selected_klass; }
    91   KlassHandle  selected_klass() const            { return _selected_klass; }
    91   methodHandle resolved_method() const           { return _resolved_method; }
    92   methodHandle resolved_method() const           { return _resolved_method; }
    92   methodHandle selected_method() const           { return _selected_method; }
    93   methodHandle selected_method() const           { return _selected_method; }
    93   Handle       resolved_appendix() const         { return _resolved_appendix; }
    94   Handle       resolved_appendix() const         { return _resolved_appendix; }
       
    95   Handle       resolved_method_type() const      { return _resolved_method_type; }
    94 
    96 
    95   BasicType    result_type() const               { return selected_method()->result_type(); }
    97   BasicType    result_type() const               { return selected_method()->result_type(); }
    96   bool         has_vtable_index() const          { return _vtable_index >= 0; }
    98   bool         has_vtable_index() const          { return _vtable_index >= 0; }
    97   bool         is_statically_bound() const       { return _vtable_index == Method::nonvirtual_vtable_index; }
    99   bool         is_statically_bound() const       { return _vtable_index == Method::nonvirtual_vtable_index; }
    98   int          vtable_index() const {
   100   int          vtable_index() const {
   111  private:
   113  private:
   112   static void lookup_method_in_klasses          (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
   114   static void lookup_method_in_klasses          (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
   113   static void lookup_instance_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
   115   static void lookup_instance_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
   114   static void lookup_method_in_interfaces       (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
   116   static void lookup_method_in_interfaces       (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
   115   static void lookup_polymorphic_method         (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature,
   117   static void lookup_polymorphic_method         (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature,
   116                                                  KlassHandle current_klass, Handle* appendix_result_or_null, TRAPS);
   118                                                  KlassHandle current_klass, Handle *appendix_result_or_null, Handle *method_type_result, TRAPS);
   117 
   119 
   118   static int vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
   120   static int vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
   119 
   121 
   120   static void resolve_klass           (KlassHandle& result, constantPoolHandle  pool, int index, TRAPS);
   122   static void resolve_klass           (KlassHandle& result, constantPoolHandle  pool, int index, TRAPS);
   121   static void resolve_klass_no_update (KlassHandle& result, constantPoolHandle pool, int index, TRAPS); // no update of constantPool entry
   123   static void resolve_klass_no_update (KlassHandle& result, constantPoolHandle pool, int index, TRAPS); // no update of constantPool entry