2805 _matching_new_methods, |
2805 _matching_new_methods, |
2806 _matching_methods_length, |
2806 _matching_methods_length, |
2807 &trace_name_printed); |
2807 &trace_name_printed); |
2808 } |
2808 } |
2809 } |
2809 } |
2810 { |
2810 |
2811 ResourceMark rm(_thread); |
2811 // the previous versions' constant pool caches may need adjustment |
2812 // PreviousVersionInfo objects returned via PreviousVersionWalker |
2812 PreviousVersionWalker pvw(_thread, ik); |
2813 // contain a GrowableArray of handles. We have to clean up the |
2813 for (PreviousVersionNode * pv_node = pvw.next_previous_version(); |
2814 // GrowableArray _after_ the PreviousVersionWalker destructor |
2814 pv_node != NULL; pv_node = pvw.next_previous_version()) { |
2815 // has destroyed the handles. |
2815 other_cp = pv_node->prev_constant_pool(); |
2816 { |
2816 cp_cache = other_cp->cache(); |
2817 // the previous versions' constant pool caches may need adjustment |
2817 if (cp_cache != NULL) { |
2818 PreviousVersionWalker pvw(ik); |
2818 cp_cache->adjust_method_entries(_matching_old_methods, |
2819 for (PreviousVersionInfo * pv_info = pvw.next_previous_version(); |
2819 _matching_new_methods, |
2820 pv_info != NULL; pv_info = pvw.next_previous_version()) { |
2820 _matching_methods_length, |
2821 other_cp = pv_info->prev_constant_pool_handle(); |
2821 &trace_name_printed); |
2822 cp_cache = other_cp->cache(); |
2822 } |
2823 if (cp_cache != NULL) { |
2823 } |
2824 cp_cache->adjust_method_entries(_matching_old_methods, |
|
2825 _matching_new_methods, |
|
2826 _matching_methods_length, |
|
2827 &trace_name_printed); |
|
2828 } |
|
2829 } |
|
2830 } // pvw is cleaned up |
|
2831 } // rm is cleaned up |
|
2832 } |
2824 } |
2833 } |
2825 } |
2834 |
2826 |
2835 void VM_RedefineClasses::update_jmethod_ids() { |
2827 void VM_RedefineClasses::update_jmethod_ids() { |
2836 for (int j = 0; j < _matching_methods_length; ++j) { |
2828 for (int j = 0; j < _matching_methods_length; ++j) { |
2940 obsolete_count++; |
2932 obsolete_count++; |
2941 |
2933 |
2942 // obsolete methods need a unique idnum |
2934 // obsolete methods need a unique idnum |
2943 u2 num = InstanceKlass::cast(_the_class_oop)->next_method_idnum(); |
2935 u2 num = InstanceKlass::cast(_the_class_oop)->next_method_idnum(); |
2944 if (num != ConstMethod::UNSET_IDNUM) { |
2936 if (num != ConstMethod::UNSET_IDNUM) { |
2945 // u2 old_num = old_method->method_idnum(); |
|
2946 old_method->set_method_idnum(num); |
2937 old_method->set_method_idnum(num); |
2947 // TO DO: attach obsolete annotations to obsolete method's new idnum |
2938 } |
2948 } |
2939 |
2949 // With tracing we try not to "yack" too much. The position of |
2940 // With tracing we try not to "yack" too much. The position of |
2950 // this trace assumes there are fewer obsolete methods than |
2941 // this trace assumes there are fewer obsolete methods than |
2951 // EMCP methods. |
2942 // EMCP methods. |
2952 RC_TRACE(0x00000100, ("mark %s(%s) as obsolete", |
2943 RC_TRACE(0x00000100, ("mark %s(%s) as obsolete", |
2953 old_method->name()->as_C_string(), |
2944 old_method->name()->as_C_string(), |