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; } |