271 // Initialization 272 void initialize_itable(bool checkconstraints, TRAPS); 273 274 // Updates 275 void initialize_with_method(Method* m); 276 277 #if INCLUDE_JVMTI 278 // RedefineClasses() API support: 279 // if any entry of this itable points to any of old_methods, 280 // replace it with the corresponding new_method. 281 // trace_name_printed is set to true if the current call has 282 // printed the klass name so that other routines in the adjust_* 283 // group don't print the klass name. 284 void adjust_method_entries(Method** old_methods, Method** new_methods, 285 int methods_length, bool * trace_name_printed); 286 bool check_no_old_or_obsolete_entries(); 287 void dump_itable(); 288 #endif // INCLUDE_JVMTI 289 290 // Setup of itable 291 static int compute_itable_size(Array<Klass*>* transitive_interfaces); 292 static void setup_itable_offset_table(instanceKlassHandle klass); 293 294 // Resolving of method to index 295 static int compute_itable_index(Method* m); 296 // ...and back again: 297 static Method* method_for_itable_index(Klass* klass, int itable_index); 298 299 // Debugging/Statistics 300 static void print_statistics() PRODUCT_RETURN; 301 private: 302 intptr_t* vtable_start() const { return ((intptr_t*)_klass()) + _table_offset; } 303 intptr_t* method_start() const { return vtable_start() + _size_offset_table * itableOffsetEntry::size(); } 304 305 // Helper methods 306 static int calc_itable_size(int num_interfaces, int num_methods) { return (num_interfaces * itableOffsetEntry::size()) + (num_methods * itableMethodEntry::size()); } 307 308 // Statistics 309 NOT_PRODUCT(static int _total_classes;) // Total no. of classes with itables 310 NOT_PRODUCT(static long _total_size;) // Total no. of bytes used for itables 311 312 static void update_stats(int size) PRODUCT_RETURN NOT_PRODUCT({ _total_classes++; _total_size += size; }) 313 }; 314 315 #endif // SHARE_VM_OOPS_KLASSVTABLE_HPP | 271 // Initialization 272 void initialize_itable(bool checkconstraints, TRAPS); 273 274 // Updates 275 void initialize_with_method(Method* m); 276 277 #if INCLUDE_JVMTI 278 // RedefineClasses() API support: 279 // if any entry of this itable points to any of old_methods, 280 // replace it with the corresponding new_method. 281 // trace_name_printed is set to true if the current call has 282 // printed the klass name so that other routines in the adjust_* 283 // group don't print the klass name. 284 void adjust_method_entries(Method** old_methods, Method** new_methods, 285 int methods_length, bool * trace_name_printed); 286 bool check_no_old_or_obsolete_entries(); 287 void dump_itable(); 288 #endif // INCLUDE_JVMTI 289 290 // Setup of itable 291 static int assign_itable_indexes_for_interface(Klass* klass); 292 static int method_count_for_interface(Klass* klass); 293 static int compute_itable_size(Array<Klass*>* transitive_interfaces); 294 static void setup_itable_offset_table(instanceKlassHandle klass); 295 296 // Resolving of method to index 297 static Method* method_for_itable_index(Klass* klass, int itable_index); 298 299 // Debugging/Statistics 300 static void print_statistics() PRODUCT_RETURN; 301 private: 302 intptr_t* vtable_start() const { return ((intptr_t*)_klass()) + _table_offset; } 303 intptr_t* method_start() const { return vtable_start() + _size_offset_table * itableOffsetEntry::size(); } 304 305 // Helper methods 306 static int calc_itable_size(int num_interfaces, int num_methods) { return (num_interfaces * itableOffsetEntry::size()) + (num_methods * itableMethodEntry::size()); } 307 308 // Statistics 309 NOT_PRODUCT(static int _total_classes;) // Total no. of classes with itables 310 NOT_PRODUCT(static long _total_size;) // Total no. of bytes used for itables 311 312 static void update_stats(int size) PRODUCT_RETURN NOT_PRODUCT({ _total_classes++; _total_size += size; }) 313 }; 314 315 #endif // SHARE_VM_OOPS_KLASSVTABLE_HPP |