< prev index next >

src/share/vm/oops/method.hpp

Print this page




  47 // (required by the interpreter)
  48 //
  49 //  Method embedded field layout (after declared fields):
  50 //   [EMBEDDED native_function       (present only if native) ]
  51 //   [EMBEDDED signature_handler     (present only if native) ]
  52 
  53 class CheckedExceptionElement;
  54 class LocalVariableTableElement;
  55 class AdapterHandlerEntry;
  56 class MethodData;
  57 class MethodCounters;
  58 class ConstMethod;
  59 class InlineTableSizes;
  60 class KlassSizeStats;
  61 
  62 class Method : public Metadata {
  63  friend class VMStructs;
  64  friend class JVMCIVMStructs;
  65  private:
  66   ConstMethod*      _constMethod;                // Method read-only data.
  67 #if defined(COMPILER2) || INCLUDE_JVMCI
  68   MethodData*       _method_data;
  69 #endif
  70   MethodCounters*   _method_counters;
  71   AccessFlags       _access_flags;               // Access flags
  72   int               _vtable_index;               // vtable index of this method (see VtableIndexFlag)
  73                                                  // note: can have vtables with >2**16 elements (because of inheritance)
  74 #ifdef CC_INTERP
  75   int               _result_index;               // C++ interpreter needs for converting results to/from stack
  76 #endif
  77   u2                _intrinsic_id;               // vmSymbols::intrinsic_id (0 == _none)
  78 
  79   // Flags
  80   enum Flags {
  81     _jfr_towrite           = 1 << 0,
  82     _caller_sensitive      = 1 << 1,
  83     _force_inline          = 1 << 2,
  84     _dont_inline           = 1 << 3,
  85     _hidden                = 1 << 4,
  86     _has_injected_profile  = 1 << 5,
  87     _running_emcp          = 1 << 6,
  88     _intrinsic_candidate   = 1 << 7,
  89     _reserved_stack_access = 1 << 8


 304                              { return constMethod()->has_exception_handler(); }
 305   int exception_table_length() const
 306                              { return constMethod()->exception_table_length(); }
 307   ExceptionTableElement* exception_table_start() const
 308                              { return constMethod()->exception_table_start(); }
 309 
 310   // Finds the first entry point bci of an exception handler for an
 311   // exception of klass ex_klass thrown at throw_bci. A value of NULL
 312   // for ex_klass indicates that the exception klass is not known; in
 313   // this case it matches any constraint class. Returns -1 if the
 314   // exception cannot be handled in this method. The handler
 315   // constraint classes are loaded if necessary. Note that this may
 316   // throw an exception if loading of the constraint classes causes
 317   // an IllegalAccessError (bugid 4307310) or an OutOfMemoryError.
 318   // If an exception is thrown, returns the bci of the
 319   // exception handler which caused the exception to be thrown, which
 320   // is needed for proper retries. See, for example,
 321   // InterpreterRuntime::exception_handler_for_exception.
 322   static int fast_exception_handler_bci_for(methodHandle mh, KlassHandle ex_klass, int throw_bci, TRAPS);
 323 
 324 #if defined(COMPILER2) || INCLUDE_JVMCI
 325   // method data access
 326   MethodData* method_data() const              {
 327     return _method_data;
 328   }
 329 
 330   void set_method_data(MethodData* data)       {
 331     // The store into method must be released. On platforms without
 332     // total store order (TSO) the reference may become visible before
 333     // the initialization of data otherwise.
 334     OrderAccess::release_store_ptr((volatile void *)&_method_data, data);
 335   }
 336 #else
 337   MethodData* method_data() const              { return NULL; }
 338   void set_method_data(MethodData* data)       { }
 339 #endif
 340 
 341   MethodCounters* method_counters() const {
 342     return _method_counters;
 343   }
 344 
 345   void clear_method_counters() {
 346     _method_counters = NULL;
 347   }
 348 
 349   bool init_method_counters(MethodCounters* counters) {
 350     // Try to install a pointer to MethodCounters, return true on success.
 351     return Atomic::cmpxchg_ptr(counters, (volatile void*)&_method_counters, NULL) == NULL;
 352   }
 353 
 354 #ifdef TIERED
 355   // We are reusing interpreter_invocation_count as a holder for the previous event count!
 356   // We can do that since interpreter_invocation_count is not used in tiered.
 357   int prev_event_count() const                   {
 358     if (method_counters() == NULL) {
 359       return 0;


 629   bool has_compiled_code() const                 { return code() != NULL; }
 630 
 631   // sizing
 632   static int header_size()                       { return sizeof(Method)/wordSize; }
 633   static int size(bool is_native);
 634   int size() const                               { return method_size(); }
 635 #if INCLUDE_SERVICES
 636   void collect_statistics(KlassSizeStats *sz) const;
 637 #endif
 638   void log_touched(TRAPS);
 639   static void print_touched_methods(outputStream* out);
 640 
 641   // interpreter support
 642   static ByteSize const_offset()                 { return byte_offset_of(Method, _constMethod       ); }
 643   static ByteSize access_flags_offset()          { return byte_offset_of(Method, _access_flags      ); }
 644 #ifdef CC_INTERP
 645   static ByteSize result_index_offset()          { return byte_offset_of(Method, _result_index ); }
 646 #endif /* CC_INTERP */
 647   static ByteSize from_compiled_offset()         { return byte_offset_of(Method, _from_compiled_entry); }
 648   static ByteSize code_offset()                  { return byte_offset_of(Method, _code); }
 649 #if defined(COMPILER2) || INCLUDE_JVMCI
 650   static ByteSize method_data_offset()           {
 651     return byte_offset_of(Method, _method_data);
 652   }
 653 #else
 654   static ByteSize method_data_offset()           {
 655     ShouldNotReachHere();
 656     return in_ByteSize(0);
 657   }
 658 #endif
 659   static ByteSize method_counters_offset()       {
 660     return byte_offset_of(Method, _method_counters);
 661   }
 662 #ifndef PRODUCT
 663   static ByteSize compiled_invocation_counter_offset() { return byte_offset_of(Method, _compiled_invocation_count); }
 664 #endif // not PRODUCT
 665   static ByteSize native_function_offset()       { return in_ByteSize(sizeof(Method));                 }
 666   static ByteSize from_interpreted_offset()      { return byte_offset_of(Method, _from_interpreted_entry ); }
 667   static ByteSize interpreter_entry_offset()     { return byte_offset_of(Method, _i2i_entry ); }
 668   static ByteSize signature_handler_offset()     { return in_ByteSize(sizeof(Method) + wordSize);      }
 669 
 670   // for code generation
 671 #if defined(COMPILER2) || INCLUDE_JVMCI
 672   static int method_data_offset_in_bytes()       { return offset_of(Method, _method_data); }
 673 #else
 674   static int method_data_offset_in_bytes()       { ShouldNotReachHere(); return 0; }
 675 #endif
 676   static int intrinsic_id_offset_in_bytes()      { return offset_of(Method, _intrinsic_id); }
 677   static int intrinsic_id_size_in_bytes()        { return sizeof(u2); }
 678 
 679   // Static methods that are used to implement member methods where an exposed this pointer
 680   // is needed due to possible GCs
 681   static objArrayHandle resolved_checked_exceptions_impl(Method* method, TRAPS);
 682 
 683   // Returns the byte code index from the byte code pointer
 684   int     bci_from(address bcp) const;
 685   address bcp_from(int bci) const;
 686   address bcp_from(address bcp) const;
 687   int validate_bci_from_bcp(address bcp) const;
 688   int validate_bci(int bci) const;
 689 
 690   // Returns the line number for a bci if debugging information for the method is prowided,
 691   // -1 is returned otherwise.
 692   int line_number_from_bci(int bci) const;
 693 
 694   // Reflection support
 695   bool is_overridden_in(Klass* k) const;




  47 // (required by the interpreter)
  48 //
  49 //  Method embedded field layout (after declared fields):
  50 //   [EMBEDDED native_function       (present only if native) ]
  51 //   [EMBEDDED signature_handler     (present only if native) ]
  52 
  53 class CheckedExceptionElement;
  54 class LocalVariableTableElement;
  55 class AdapterHandlerEntry;
  56 class MethodData;
  57 class MethodCounters;
  58 class ConstMethod;
  59 class InlineTableSizes;
  60 class KlassSizeStats;
  61 
  62 class Method : public Metadata {
  63  friend class VMStructs;
  64  friend class JVMCIVMStructs;
  65  private:
  66   ConstMethod*      _constMethod;                // Method read-only data.

  67   MethodData*       _method_data;

  68   MethodCounters*   _method_counters;
  69   AccessFlags       _access_flags;               // Access flags
  70   int               _vtable_index;               // vtable index of this method (see VtableIndexFlag)
  71                                                  // note: can have vtables with >2**16 elements (because of inheritance)
  72 #ifdef CC_INTERP
  73   int               _result_index;               // C++ interpreter needs for converting results to/from stack
  74 #endif
  75   u2                _intrinsic_id;               // vmSymbols::intrinsic_id (0 == _none)
  76 
  77   // Flags
  78   enum Flags {
  79     _jfr_towrite           = 1 << 0,
  80     _caller_sensitive      = 1 << 1,
  81     _force_inline          = 1 << 2,
  82     _dont_inline           = 1 << 3,
  83     _hidden                = 1 << 4,
  84     _has_injected_profile  = 1 << 5,
  85     _running_emcp          = 1 << 6,
  86     _intrinsic_candidate   = 1 << 7,
  87     _reserved_stack_access = 1 << 8


 302                              { return constMethod()->has_exception_handler(); }
 303   int exception_table_length() const
 304                              { return constMethod()->exception_table_length(); }
 305   ExceptionTableElement* exception_table_start() const
 306                              { return constMethod()->exception_table_start(); }
 307 
 308   // Finds the first entry point bci of an exception handler for an
 309   // exception of klass ex_klass thrown at throw_bci. A value of NULL
 310   // for ex_klass indicates that the exception klass is not known; in
 311   // this case it matches any constraint class. Returns -1 if the
 312   // exception cannot be handled in this method. The handler
 313   // constraint classes are loaded if necessary. Note that this may
 314   // throw an exception if loading of the constraint classes causes
 315   // an IllegalAccessError (bugid 4307310) or an OutOfMemoryError.
 316   // If an exception is thrown, returns the bci of the
 317   // exception handler which caused the exception to be thrown, which
 318   // is needed for proper retries. See, for example,
 319   // InterpreterRuntime::exception_handler_for_exception.
 320   static int fast_exception_handler_bci_for(methodHandle mh, KlassHandle ex_klass, int throw_bci, TRAPS);
 321 

 322   // method data access
 323   MethodData* method_data() const              {
 324     return _method_data;
 325   }
 326 
 327   void set_method_data(MethodData* data)       {
 328     // The store into method must be released. On platforms without
 329     // total store order (TSO) the reference may become visible before
 330     // the initialization of data otherwise.
 331     OrderAccess::release_store_ptr((volatile void *)&_method_data, data);
 332   }




 333 
 334   MethodCounters* method_counters() const {
 335     return _method_counters;
 336   }
 337 
 338   void clear_method_counters() {
 339     _method_counters = NULL;
 340   }
 341 
 342   bool init_method_counters(MethodCounters* counters) {
 343     // Try to install a pointer to MethodCounters, return true on success.
 344     return Atomic::cmpxchg_ptr(counters, (volatile void*)&_method_counters, NULL) == NULL;
 345   }
 346 
 347 #ifdef TIERED
 348   // We are reusing interpreter_invocation_count as a holder for the previous event count!
 349   // We can do that since interpreter_invocation_count is not used in tiered.
 350   int prev_event_count() const                   {
 351     if (method_counters() == NULL) {
 352       return 0;


 622   bool has_compiled_code() const                 { return code() != NULL; }
 623 
 624   // sizing
 625   static int header_size()                       { return sizeof(Method)/wordSize; }
 626   static int size(bool is_native);
 627   int size() const                               { return method_size(); }
 628 #if INCLUDE_SERVICES
 629   void collect_statistics(KlassSizeStats *sz) const;
 630 #endif
 631   void log_touched(TRAPS);
 632   static void print_touched_methods(outputStream* out);
 633 
 634   // interpreter support
 635   static ByteSize const_offset()                 { return byte_offset_of(Method, _constMethod       ); }
 636   static ByteSize access_flags_offset()          { return byte_offset_of(Method, _access_flags      ); }
 637 #ifdef CC_INTERP
 638   static ByteSize result_index_offset()          { return byte_offset_of(Method, _result_index ); }
 639 #endif /* CC_INTERP */
 640   static ByteSize from_compiled_offset()         { return byte_offset_of(Method, _from_compiled_entry); }
 641   static ByteSize code_offset()                  { return byte_offset_of(Method, _code); }

 642   static ByteSize method_data_offset()           {
 643     return byte_offset_of(Method, _method_data);
 644   }






 645   static ByteSize method_counters_offset()       {
 646     return byte_offset_of(Method, _method_counters);
 647   }
 648 #ifndef PRODUCT
 649   static ByteSize compiled_invocation_counter_offset() { return byte_offset_of(Method, _compiled_invocation_count); }
 650 #endif // not PRODUCT
 651   static ByteSize native_function_offset()       { return in_ByteSize(sizeof(Method));                 }
 652   static ByteSize from_interpreted_offset()      { return byte_offset_of(Method, _from_interpreted_entry ); }
 653   static ByteSize interpreter_entry_offset()     { return byte_offset_of(Method, _i2i_entry ); }
 654   static ByteSize signature_handler_offset()     { return in_ByteSize(sizeof(Method) + wordSize);      }
 655 
 656   // for code generation

 657   static int method_data_offset_in_bytes()       { return offset_of(Method, _method_data); }



 658   static int intrinsic_id_offset_in_bytes()      { return offset_of(Method, _intrinsic_id); }
 659   static int intrinsic_id_size_in_bytes()        { return sizeof(u2); }
 660 
 661   // Static methods that are used to implement member methods where an exposed this pointer
 662   // is needed due to possible GCs
 663   static objArrayHandle resolved_checked_exceptions_impl(Method* method, TRAPS);
 664 
 665   // Returns the byte code index from the byte code pointer
 666   int     bci_from(address bcp) const;
 667   address bcp_from(int bci) const;
 668   address bcp_from(address bcp) const;
 669   int validate_bci_from_bcp(address bcp) const;
 670   int validate_bci(int bci) const;
 671 
 672   // Returns the line number for a bci if debugging information for the method is prowided,
 673   // -1 is returned otherwise.
 674   int line_number_from_bci(int bci) const;
 675 
 676   // Reflection support
 677   bool is_overridden_in(Klass* k) const;


< prev index next >