src/hotspot/share/oops/klassVtable.hpp
changeset 51329 9c68699bebe5
parent 51096 695dff91a997
child 53244 9807daeb47c4
equal deleted inserted replaced
51328:fad2334b2906 51329:9c68699bebe5
    90                                                    Array<Method*>* methods,
    90                                                    Array<Method*>* methods,
    91                                                    AccessFlags class_flags,
    91                                                    AccessFlags class_flags,
    92                                                    u2 major_version,
    92                                                    u2 major_version,
    93                                                    Handle classloader,
    93                                                    Handle classloader,
    94                                                    Symbol* classname,
    94                                                    Symbol* classname,
    95                                                    Array<Klass*>* local_interfaces,
    95                                                    Array<InstanceKlass*>* local_interfaces,
    96                                                    TRAPS);
    96                                                    TRAPS);
    97 
    97 
    98 #if INCLUDE_JVMTI
    98 #if INCLUDE_JVMTI
    99   // RedefineClasses() API support:
    99   // RedefineClasses() API support:
   100   // If any entry of this vtable points to any of old_methods,
   100   // If any entry of this vtable points to any of old_methods,
   157       GrowableArray<Method*>* new_mirandas,
   157       GrowableArray<Method*>* new_mirandas,
   158       GrowableArray<Method*>* all_mirandas,
   158       GrowableArray<Method*>* all_mirandas,
   159       const Klass* super,
   159       const Klass* super,
   160       Array<Method*>* class_methods,
   160       Array<Method*>* class_methods,
   161       Array<Method*>* default_methods,
   161       Array<Method*>* default_methods,
   162       Array<Klass*>* local_interfaces,
   162       Array<InstanceKlass*>* local_interfaces,
   163       bool is_interface);
   163       bool is_interface);
   164   void verify_against(outputStream* st, klassVtable* vt, int index);
   164   void verify_against(outputStream* st, klassVtable* vt, int index);
   165   inline InstanceKlass* ik() const;
   165   inline InstanceKlass* ik() const;
   166   // When loading a class from CDS archive at run time, and no class redefintion
   166   // When loading a class from CDS archive at run time, and no class redefintion
   167   // has happened, it is expected that the class's itable/vtables are
   167   // has happened, it is expected that the class's itable/vtables are
   233 class klassItable;
   233 class klassItable;
   234 class itableMethodEntry;
   234 class itableMethodEntry;
   235 
   235 
   236 class itableOffsetEntry {
   236 class itableOffsetEntry {
   237  private:
   237  private:
   238   Klass* _interface;
   238   InstanceKlass* _interface;
   239   int      _offset;
   239   int      _offset;
   240  public:
   240  public:
   241   Klass* interface_klass() const { return _interface; }
   241   InstanceKlass* interface_klass() const { return _interface; }
   242   Klass**interface_klass_addr()  { return &_interface; }
   242   InstanceKlass**interface_klass_addr()  { return &_interface; }
   243   int      offset() const          { return _offset; }
   243   int      offset() const          { return _offset; }
   244 
   244 
   245   static itableMethodEntry* method_entry(Klass* k, int offset) { return (itableMethodEntry*)(((address)k) + offset); }
   245   static itableMethodEntry* method_entry(Klass* k, int offset) { return (itableMethodEntry*)(((address)k) + offset); }
   246   itableMethodEntry* first_method_entry(Klass* k)              { return method_entry(k, _offset); }
   246   itableMethodEntry* first_method_entry(Klass* k)              { return method_entry(k, _offset); }
   247 
   247 
   248   void initialize(Klass* interf, int offset) { _interface = interf; _offset = offset; }
   248   void initialize(InstanceKlass* interf, int offset) { _interface = interf; _offset = offset; }
   249 
   249 
   250   // Static size and offset accessors
   250   // Static size and offset accessors
   251   static int size()                       { return sizeof(itableOffsetEntry) / wordSize; }    // size in words
   251   static int size()                       { return sizeof(itableOffsetEntry) / wordSize; }    // size in words
   252   static int interface_offset_in_bytes()  { return offset_of(itableOffsetEntry, _interface); }
   252   static int interface_offset_in_bytes()  { return offset_of(itableOffsetEntry, _interface); }
   253   static int offset_offset_in_bytes()     { return offset_of(itableOffsetEntry, _offset); }
   253   static int offset_offset_in_bytes()     { return offset_of(itableOffsetEntry, _offset); }
   298   InstanceKlass*       _klass;             // my klass
   298   InstanceKlass*       _klass;             // my klass
   299   int                  _table_offset;      // offset of start of itable data within klass (in words)
   299   int                  _table_offset;      // offset of start of itable data within klass (in words)
   300   int                  _size_offset_table; // size of offset table (in itableOffset entries)
   300   int                  _size_offset_table; // size of offset table (in itableOffset entries)
   301   int                  _size_method_table; // size of methodtable (in itableMethodEntry entries)
   301   int                  _size_method_table; // size of methodtable (in itableMethodEntry entries)
   302 
   302 
   303   void initialize_itable_for_interface(int method_table_offset, Klass* interf_h, bool checkconstraints, TRAPS);
   303   void initialize_itable_for_interface(int method_table_offset, InstanceKlass* interf_h, bool checkconstraints, TRAPS);
   304  public:
   304  public:
   305   klassItable(InstanceKlass* klass);
   305   klassItable(InstanceKlass* klass);
   306 
   306 
   307   itableOffsetEntry* offset_entry(int i) { assert(0 <= i && i <= _size_offset_table, "index out of bounds");
   307   itableOffsetEntry* offset_entry(int i) { assert(0 <= i && i <= _size_offset_table, "index out of bounds");
   308                                            return &((itableOffsetEntry*)vtable_start())[i]; }
   308                                            return &((itableOffsetEntry*)vtable_start())[i]; }
   326   bool check_no_old_or_obsolete_entries();
   326   bool check_no_old_or_obsolete_entries();
   327   void dump_itable();
   327   void dump_itable();
   328 #endif // INCLUDE_JVMTI
   328 #endif // INCLUDE_JVMTI
   329 
   329 
   330   // Setup of itable
   330   // Setup of itable
   331   static int assign_itable_indices_for_interface(Klass* klass, TRAPS);
   331   static int assign_itable_indices_for_interface(InstanceKlass* klass, TRAPS);
   332   static int method_count_for_interface(Klass* klass);
   332   static int method_count_for_interface(InstanceKlass* klass);
   333   static int compute_itable_size(Array<Klass*>* transitive_interfaces);
   333   static int compute_itable_size(Array<InstanceKlass*>* transitive_interfaces);
   334   static void setup_itable_offset_table(InstanceKlass* klass);
   334   static void setup_itable_offset_table(InstanceKlass* klass);
   335 
   335 
   336   // Resolving of method to index
   336   // Resolving of method to index
   337   static Method* method_for_itable_index(Klass* klass, int itable_index);
   337   static Method* method_for_itable_index(InstanceKlass* klass, int itable_index);
   338 
   338 
   339   // Debugging/Statistics
   339   // Debugging/Statistics
   340   static void print_statistics() PRODUCT_RETURN;
   340   static void print_statistics() PRODUCT_RETURN;
   341  private:
   341  private:
   342   intptr_t* vtable_start() const { return ((intptr_t*)_klass) + _table_offset; }
   342   intptr_t* vtable_start() const { return ((intptr_t*)_klass) + _table_offset; }