85 // - replacing parts in the_class with parts from scratch_class |
85 // - replacing parts in the_class with parts from scratch_class |
86 // - adding weak reference(s) to track the obsolete but interesting |
86 // - adding weak reference(s) to track the obsolete but interesting |
87 // parts of the_class |
87 // parts of the_class |
88 // - adjusting constant pool caches and vtables in other classes |
88 // - adjusting constant pool caches and vtables in other classes |
89 // that refer to methods in the_class. These adjustments use the |
89 // that refer to methods in the_class. These adjustments use the |
90 // SystemDictionary::classes_do() facility which only allows |
90 // ClassLoaderDataGraph::classes_do() facility which only allows |
91 // a helper method to be specified. The interesting parameters |
91 // a helper method to be specified. The interesting parameters |
92 // that we would like to pass to the helper method are saved in |
92 // that we would like to pass to the helper method are saved in |
93 // static global fields in the VM operation. |
93 // static global fields in the VM operation. |
94 // - telling the SystemDictionary to notice our changes |
94 // - telling the SystemDictionary to notice our changes |
95 // |
95 // |
331 // coordinate a cleanup of these constants with Runtime. |
331 // coordinate a cleanup of these constants with Runtime. |
332 // |
332 // |
333 |
333 |
334 class VM_RedefineClasses: public VM_Operation { |
334 class VM_RedefineClasses: public VM_Operation { |
335 private: |
335 private: |
336 // These static fields are needed by SystemDictionary::classes_do() |
336 // These static fields are needed by ClassLoaderDataGraph::classes_do() |
337 // facility and the adjust_cpool_cache_and_vtable() helper: |
337 // facility and the AdjustCpoolCacheAndVtable helper: |
338 static Array<Method*>* _old_methods; |
338 static Array<Method*>* _old_methods; |
339 static Array<Method*>* _new_methods; |
339 static Array<Method*>* _new_methods; |
340 static Method** _matching_old_methods; |
340 static Method** _matching_old_methods; |
341 static Method** _matching_new_methods; |
341 static Method** _matching_new_methods; |
342 static Method** _deleted_methods; |
342 static Method** _deleted_methods; |
405 // used when information about the previous version of the_class |
405 // used when information about the previous version of the_class |
406 // is squirreled away. |
406 // is squirreled away. |
407 void check_methods_and_mark_as_obsolete(BitMap *emcp_methods, |
407 void check_methods_and_mark_as_obsolete(BitMap *emcp_methods, |
408 int * emcp_method_count_p); |
408 int * emcp_method_count_p); |
409 void transfer_old_native_function_registrations(instanceKlassHandle the_class); |
409 void transfer_old_native_function_registrations(instanceKlassHandle the_class); |
410 |
|
411 // Unevolving classes may point to methods of the_class directly |
|
412 // from their constant pool caches, itables, and/or vtables. We |
|
413 // use the SystemDictionary::classes_do() facility and this helper |
|
414 // to fix up these pointers. |
|
415 static void adjust_cpool_cache_and_vtable(Klass* k_oop, ClassLoaderData* initiating_loader, TRAPS); |
|
416 static void adjust_array_vtable(Klass* k_oop); |
|
417 |
410 |
418 // Install the redefinition of a class |
411 // Install the redefinition of a class |
419 void redefine_single_class(jclass the_jclass, |
412 void redefine_single_class(jclass the_jclass, |
420 Klass* scratch_class_oop, TRAPS); |
413 Klass* scratch_class_oop, TRAPS); |
421 |
414 |
478 instanceKlassHandle scratch_class, |
471 instanceKlassHandle scratch_class, |
479 constantPoolHandle scratch_cp, int scratch_cp_length, TRAPS); |
472 constantPoolHandle scratch_cp, int scratch_cp_length, TRAPS); |
480 |
473 |
481 void flush_dependent_code(instanceKlassHandle k_h, TRAPS); |
474 void flush_dependent_code(instanceKlassHandle k_h, TRAPS); |
482 |
475 |
483 static void check_class(Klass* k_oop, ClassLoaderData* initiating_loader, |
|
484 TRAPS); |
|
485 static void dump_methods(); |
476 static void dump_methods(); |
|
477 |
|
478 // Check that there are no old or obsolete methods |
|
479 class CheckClass : public KlassClosure { |
|
480 Thread* _thread; |
|
481 public: |
|
482 CheckClass(Thread* t) : _thread(t) {} |
|
483 void do_klass(Klass* k); |
|
484 }; |
|
485 |
|
486 // Unevolving classes may point to methods of the_class directly |
|
487 // from their constant pool caches, itables, and/or vtables. We |
|
488 // use the ClassLoaderDataGraph::classes_do() facility and this helper |
|
489 // to fix up these pointers. |
|
490 class AdjustCpoolCacheAndVtable : public KlassClosure { |
|
491 Thread* _thread; |
|
492 public: |
|
493 AdjustCpoolCacheAndVtable(Thread* t) : _thread(t) {} |
|
494 void do_klass(Klass* k); |
|
495 }; |
486 |
496 |
487 public: |
497 public: |
488 VM_RedefineClasses(jint class_count, |
498 VM_RedefineClasses(jint class_count, |
489 const jvmtiClassDefinition *class_defs, |
499 const jvmtiClassDefinition *class_defs, |
490 JvmtiClassLoadKind class_load_kind); |
500 JvmtiClassLoadKind class_load_kind); |