24 |
24 |
25 #include "precompiled.hpp" |
25 #include "precompiled.hpp" |
26 #include "classfile/systemDictionary.hpp" |
26 #include "classfile/systemDictionary.hpp" |
27 #include "classfile/verifier.hpp" |
27 #include "classfile/verifier.hpp" |
28 #include "code/codeCache.hpp" |
28 #include "code/codeCache.hpp" |
|
29 #include "compiler/compileBroker.hpp" |
29 #include "interpreter/oopMapCache.hpp" |
30 #include "interpreter/oopMapCache.hpp" |
30 #include "interpreter/rewriter.hpp" |
31 #include "interpreter/rewriter.hpp" |
31 #include "memory/gcLocker.hpp" |
32 #include "memory/gcLocker.hpp" |
|
33 #include "memory/metadataFactory.hpp" |
|
34 #include "memory/metaspaceShared.hpp" |
32 #include "memory/universe.inline.hpp" |
35 #include "memory/universe.inline.hpp" |
33 #include "oops/fieldStreams.hpp" |
36 #include "oops/fieldStreams.hpp" |
34 #include "oops/klassVtable.hpp" |
37 #include "oops/klassVtable.hpp" |
35 #include "prims/jvmtiImpl.hpp" |
38 #include "prims/jvmtiImpl.hpp" |
36 #include "prims/jvmtiRedefineClasses.hpp" |
39 #include "prims/jvmtiRedefineClasses.hpp" |
38 #include "runtime/deoptimization.hpp" |
41 #include "runtime/deoptimization.hpp" |
39 #include "runtime/relocator.hpp" |
42 #include "runtime/relocator.hpp" |
40 #include "utilities/bitMap.inline.hpp" |
43 #include "utilities/bitMap.inline.hpp" |
41 |
44 |
42 |
45 |
43 objArrayOop VM_RedefineClasses::_old_methods = NULL; |
46 Array<Method*>* VM_RedefineClasses::_old_methods = NULL; |
44 objArrayOop VM_RedefineClasses::_new_methods = NULL; |
47 Array<Method*>* VM_RedefineClasses::_new_methods = NULL; |
45 methodOop* VM_RedefineClasses::_matching_old_methods = NULL; |
48 Method** VM_RedefineClasses::_matching_old_methods = NULL; |
46 methodOop* VM_RedefineClasses::_matching_new_methods = NULL; |
49 Method** VM_RedefineClasses::_matching_new_methods = NULL; |
47 methodOop* VM_RedefineClasses::_deleted_methods = NULL; |
50 Method** VM_RedefineClasses::_deleted_methods = NULL; |
48 methodOop* VM_RedefineClasses::_added_methods = NULL; |
51 Method** VM_RedefineClasses::_added_methods = NULL; |
49 int VM_RedefineClasses::_matching_methods_length = 0; |
52 int VM_RedefineClasses::_matching_methods_length = 0; |
50 int VM_RedefineClasses::_deleted_methods_length = 0; |
53 int VM_RedefineClasses::_deleted_methods_length = 0; |
51 int VM_RedefineClasses::_added_methods_length = 0; |
54 int VM_RedefineClasses::_added_methods_length = 0; |
52 klassOop VM_RedefineClasses::_the_class_oop = NULL; |
55 Klass* VM_RedefineClasses::_the_class_oop = NULL; |
53 |
56 |
54 |
57 |
55 VM_RedefineClasses::VM_RedefineClasses(jint class_count, |
58 VM_RedefineClasses::VM_RedefineClasses(jint class_count, |
56 const jvmtiClassDefinition *class_defs, |
59 const jvmtiClassDefinition *class_defs, |
57 JvmtiClassLoadKind class_load_kind) { |
60 JvmtiClassLoadKind class_load_kind) { |
91 |
94 |
92 // We first load new class versions in the prologue, because somewhere down the |
95 // We first load new class versions in the prologue, because somewhere down the |
93 // call chain it is required that the current thread is a Java thread. |
96 // call chain it is required that the current thread is a Java thread. |
94 _res = load_new_class_versions(Thread::current()); |
97 _res = load_new_class_versions(Thread::current()); |
95 if (_res != JVMTI_ERROR_NONE) { |
98 if (_res != JVMTI_ERROR_NONE) { |
|
99 // free any successfully created classes, since none are redefined |
|
100 for (int i = 0; i < _class_count; i++) { |
|
101 if (_scratch_classes[i] != NULL) { |
|
102 ClassLoaderData* cld = _scratch_classes[i]->class_loader_data(); |
|
103 // Free the memory for this class at class unloading time. Not before |
|
104 // because CMS might think this is still live. |
|
105 cld->add_to_deallocate_list((InstanceKlass*)_scratch_classes[i]); |
|
106 } |
|
107 } |
96 // Free os::malloc allocated memory in load_new_class_version. |
108 // Free os::malloc allocated memory in load_new_class_version. |
97 os::free(_scratch_classes); |
109 os::free(_scratch_classes); |
98 RC_TIMER_STOP(_timer_vm_op_prologue); |
110 RC_TIMER_STOP(_timer_vm_op_prologue); |
99 return false; |
111 return false; |
100 } |
112 } |
101 |
113 |
102 RC_TIMER_STOP(_timer_vm_op_prologue); |
114 RC_TIMER_STOP(_timer_vm_op_prologue); |
103 return true; |
115 return true; |
104 } |
116 } |
|
117 |
|
118 // Keep track of marked on-stack metadata so it can be cleared. |
|
119 GrowableArray<Metadata*>* _marked_objects = NULL; |
|
120 NOT_PRODUCT(bool MetadataOnStackMark::_is_active = false;) |
|
121 |
|
122 // Walk metadata on the stack and mark it so that redefinition doesn't delete |
|
123 // it. Class unloading also walks the previous versions and might try to |
|
124 // delete it, so this class is used by class unloading also. |
|
125 MetadataOnStackMark::MetadataOnStackMark() { |
|
126 assert(SafepointSynchronize::is_at_safepoint(), "sanity check"); |
|
127 NOT_PRODUCT(_is_active = true;) |
|
128 if (_marked_objects == NULL) { |
|
129 _marked_objects = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(1000, true); |
|
130 } |
|
131 Threads::metadata_do(Metadata::mark_on_stack); |
|
132 CodeCache::alive_nmethods_do(nmethod::mark_on_stack); |
|
133 CompileBroker::mark_on_stack(); |
|
134 } |
|
135 |
|
136 MetadataOnStackMark::~MetadataOnStackMark() { |
|
137 assert(SafepointSynchronize::is_at_safepoint(), "sanity check"); |
|
138 // Unmark everything that was marked. Can't do the same walk because |
|
139 // redefine classes messes up the code cache so the set of methods |
|
140 // might not be the same. |
|
141 for (int i = 0; i< _marked_objects->length(); i++) { |
|
142 _marked_objects->at(i)->set_on_stack(false); |
|
143 } |
|
144 _marked_objects->clear(); // reuse growable array for next time. |
|
145 NOT_PRODUCT(_is_active = false;) |
|
146 } |
|
147 |
|
148 // Record which objects are marked so we can unmark the same objects. |
|
149 void MetadataOnStackMark::record(Metadata* m) { |
|
150 assert(_is_active, "metadata on stack marking is active"); |
|
151 _marked_objects->push(m); |
|
152 } |
|
153 |
105 |
154 |
106 void VM_RedefineClasses::doit() { |
155 void VM_RedefineClasses::doit() { |
107 Thread *thread = Thread::current(); |
156 Thread *thread = Thread::current(); |
108 |
157 |
109 if (UseSharedSpaces) { |
158 if (UseSharedSpaces) { |
110 // Sharing is enabled so we remap the shared readonly space to |
159 // Sharing is enabled so we remap the shared readonly space to |
111 // shared readwrite, private just in case we need to redefine |
160 // shared readwrite, private just in case we need to redefine |
112 // a shared class. We do the remap during the doit() phase of |
161 // a shared class. We do the remap during the doit() phase of |
113 // the safepoint to be safer. |
162 // the safepoint to be safer. |
114 if (!CompactingPermGenGen::remap_shared_readonly_as_readwrite()) { |
163 if (!MetaspaceShared::remap_shared_readonly_as_readwrite()) { |
115 RC_TRACE_WITH_THREAD(0x00000001, thread, |
164 RC_TRACE_WITH_THREAD(0x00000001, thread, |
116 ("failed to remap shared readonly space to readwrite, private")); |
165 ("failed to remap shared readonly space to readwrite, private")); |
117 _res = JVMTI_ERROR_INTERNAL; |
166 _res = JVMTI_ERROR_INTERNAL; |
118 return; |
167 return; |
119 } |
168 } |
120 } |
169 } |
121 |
170 |
|
171 // Mark methods seen on stack and everywhere else so old methods are not |
|
172 // cleaned up if they're on the stack. |
|
173 MetadataOnStackMark md_on_stack; |
|
174 HandleMark hm(thread); // make sure any handles created are deleted |
|
175 // before the stack walk again. |
|
176 |
122 for (int i = 0; i < _class_count; i++) { |
177 for (int i = 0; i < _class_count; i++) { |
123 redefine_single_class(_class_defs[i].klass, _scratch_classes[i], thread); |
178 redefine_single_class(_class_defs[i].klass, _scratch_classes[i], thread); |
124 } |
179 ClassLoaderData* cld = _scratch_classes[i]->class_loader_data(); |
|
180 // Free the memory for this class at class unloading time. Not before |
|
181 // because CMS might think this is still live. |
|
182 cld->add_to_deallocate_list((InstanceKlass*)_scratch_classes[i]); |
|
183 _scratch_classes[i] = NULL; |
|
184 } |
|
185 |
125 // Disable any dependent concurrent compilations |
186 // Disable any dependent concurrent compilations |
126 SystemDictionary::notice_modification(); |
187 SystemDictionary::notice_modification(); |
127 |
188 |
128 // Set flag indicating that some invariants are no longer true. |
189 // Set flag indicating that some invariants are no longer true. |
129 // See jvmtiExport.hpp for detailed explanation. |
190 // See jvmtiExport.hpp for detailed explanation. |
230 case JVM_CONSTANT_Float: // fall through |
290 case JVM_CONSTANT_Float: // fall through |
231 case JVM_CONSTANT_Integer: // fall through |
291 case JVM_CONSTANT_Integer: // fall through |
232 case JVM_CONSTANT_Utf8: // fall through |
292 case JVM_CONSTANT_Utf8: // fall through |
233 |
293 |
234 // This was an indirect CP entry, but it has been changed into |
294 // This was an indirect CP entry, but it has been changed into |
235 // an interned string so this entry can be directly appended. |
295 // Symbol*s so this entry can be directly appended. |
236 case JVM_CONSTANT_String: // fall through |
296 case JVM_CONSTANT_String: // fall through |
237 |
297 |
238 // These were indirect CP entries, but they have been changed into |
298 // These were indirect CP entries, but they have been changed into |
239 // Symbol*s so these entries can be directly appended. |
299 // Symbol*s so these entries can be directly appended. |
240 case JVM_CONSTANT_UnresolvedClass: // fall through |
300 case JVM_CONSTANT_UnresolvedClass: // fall through |
241 case JVM_CONSTANT_UnresolvedString: |
|
242 { |
301 { |
243 constantPoolOopDesc::copy_entry_to(scratch_cp, scratch_i, *merge_cp_p, *merge_cp_length_p, |
302 ConstantPool::copy_entry_to(scratch_cp, scratch_i, *merge_cp_p, *merge_cp_length_p, |
244 THREAD); |
303 THREAD); |
245 |
304 |
246 if (scratch_i != *merge_cp_length_p) { |
305 if (scratch_i != *merge_cp_length_p) { |
247 // The new entry in *merge_cp_p is at a different index than |
306 // The new entry in *merge_cp_p is at a different index than |
248 // the new entry in scratch_cp so we need to map the index values. |
307 // the new entry in scratch_cp so we need to map the index values. |
483 } break; |
541 } break; |
484 } // end switch tag value |
542 } // end switch tag value |
485 } // end append_entry() |
543 } // end append_entry() |
486 |
544 |
487 |
545 |
488 void VM_RedefineClasses::swap_all_method_annotations(int i, int j, instanceKlassHandle scratch_class) { |
546 void VM_RedefineClasses::swap_all_method_annotations(int i, int j, instanceKlassHandle scratch_class, TRAPS) { |
489 typeArrayOop save; |
547 AnnotationArray* save; |
490 |
548 |
491 save = scratch_class->get_method_annotations_of(i); |
549 Annotations* sca = scratch_class->annotations(); |
492 scratch_class->set_method_annotations_of(i, scratch_class->get_method_annotations_of(j)); |
550 if (sca == NULL) return; |
493 scratch_class->set_method_annotations_of(j, save); |
551 |
494 |
552 save = sca->get_method_annotations_of(i); |
495 save = scratch_class->get_method_parameter_annotations_of(i); |
553 sca->set_method_annotations_of(scratch_class, i, sca->get_method_annotations_of(j), CHECK); |
496 scratch_class->set_method_parameter_annotations_of(i, scratch_class->get_method_parameter_annotations_of(j)); |
554 sca->set_method_annotations_of(scratch_class, j, save, CHECK); |
497 scratch_class->set_method_parameter_annotations_of(j, save); |
555 |
498 |
556 save = sca->get_method_parameter_annotations_of(i); |
499 save = scratch_class->get_method_default_annotations_of(i); |
557 sca->set_method_parameter_annotations_of(scratch_class, i, sca->get_method_parameter_annotations_of(j), CHECK); |
500 scratch_class->set_method_default_annotations_of(i, scratch_class->get_method_default_annotations_of(j)); |
558 sca->set_method_parameter_annotations_of(scratch_class, j, save, CHECK); |
501 scratch_class->set_method_default_annotations_of(j, save); |
559 |
|
560 save = sca->get_method_default_annotations_of(i); |
|
561 sca->set_method_default_annotations_of(scratch_class, i, sca->get_method_default_annotations_of(j), CHECK); |
|
562 sca->set_method_default_annotations_of(scratch_class, j, save, CHECK); |
502 } |
563 } |
503 |
564 |
504 |
565 |
505 jvmtiError VM_RedefineClasses::compare_and_normalize_class_versions( |
566 jvmtiError VM_RedefineClasses::compare_and_normalize_class_versions( |
506 instanceKlassHandle the_class, |
567 instanceKlassHandle the_class, |
522 // interfaces are the same, i.e. the order of declaration (which, however, if changed in the |
583 // interfaces are the same, i.e. the order of declaration (which, however, if changed in the |
523 // .java file, also changes in .class file) should not matter. However, comparing sets is |
584 // .java file, also changes in .class file) should not matter. However, comparing sets is |
524 // technically a bit more difficult, and, more importantly, I am not sure at present that the |
585 // technically a bit more difficult, and, more importantly, I am not sure at present that the |
525 // order of interfaces does not matter on the implementation level, i.e. that the VM does not |
586 // order of interfaces does not matter on the implementation level, i.e. that the VM does not |
526 // rely on it somewhere. |
587 // rely on it somewhere. |
527 objArrayOop k_interfaces = the_class->local_interfaces(); |
588 Array<Klass*>* k_interfaces = the_class->local_interfaces(); |
528 objArrayOop k_new_interfaces = scratch_class->local_interfaces(); |
589 Array<Klass*>* k_new_interfaces = scratch_class->local_interfaces(); |
529 int n_intfs = k_interfaces->length(); |
590 int n_intfs = k_interfaces->length(); |
530 if (n_intfs != k_new_interfaces->length()) { |
591 if (n_intfs != k_new_interfaces->length()) { |
531 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; |
592 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; |
532 } |
593 } |
533 for (i = 0; i < n_intfs; i++) { |
594 for (i = 0; i < n_intfs; i++) { |
534 if (Klass::cast((klassOop) k_interfaces->obj_at(i))->name() != |
595 if (Klass::cast(k_interfaces->at(i))->name() != |
535 Klass::cast((klassOop) k_new_interfaces->obj_at(i))->name()) { |
596 Klass::cast(k_new_interfaces->at(i))->name()) { |
536 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; |
597 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; |
537 } |
598 } |
538 } |
599 } |
539 |
600 |
540 // Check whether class is in the error init state. |
601 // Check whether class is in the error init state. |
589 // signature. In order to determine what fate befell the methods, |
650 // signature. In order to determine what fate befell the methods, |
590 // this code places the overloaded new methods that have matching |
651 // this code places the overloaded new methods that have matching |
591 // old methods in the same order as the old methods and places |
652 // old methods in the same order as the old methods and places |
592 // new overloaded methods at the end of overloaded methods of |
653 // new overloaded methods at the end of overloaded methods of |
593 // that name. The code for this order normalization is adapted |
654 // that name. The code for this order normalization is adapted |
594 // from the algorithm used in instanceKlass::find_method(). |
655 // from the algorithm used in InstanceKlass::find_method(). |
595 // Since we are swapping out of order entries as we find them, |
656 // Since we are swapping out of order entries as we find them, |
596 // we only have to search forward through the overloaded methods. |
657 // we only have to search forward through the overloaded methods. |
597 // Methods which are added and have the same name as an existing |
658 // Methods which are added and have the same name as an existing |
598 // method (but different signature) will be put at the end of |
659 // method (but different signature) will be put at the end of |
599 // the methods with that name, and the name mismatch code will |
660 // the methods with that name, and the name mismatch code will |
600 // handle them. |
661 // handle them. |
601 objArrayHandle k_old_methods(the_class->methods()); |
662 Array<Method*>* k_old_methods(the_class->methods()); |
602 objArrayHandle k_new_methods(scratch_class->methods()); |
663 Array<Method*>* k_new_methods(scratch_class->methods()); |
603 int n_old_methods = k_old_methods->length(); |
664 int n_old_methods = k_old_methods->length(); |
604 int n_new_methods = k_new_methods->length(); |
665 int n_new_methods = k_new_methods->length(); |
|
666 Thread* thread = Thread::current(); |
605 |
667 |
606 int ni = 0; |
668 int ni = 0; |
607 int oi = 0; |
669 int oi = 0; |
608 while (true) { |
670 while (true) { |
609 methodOop k_old_method; |
671 Method* k_old_method; |
610 methodOop k_new_method; |
672 Method* k_new_method; |
611 enum { matched, added, deleted, undetermined } method_was = undetermined; |
673 enum { matched, added, deleted, undetermined } method_was = undetermined; |
612 |
674 |
613 if (oi >= n_old_methods) { |
675 if (oi >= n_old_methods) { |
614 if (ni >= n_new_methods) { |
676 if (ni >= n_new_methods) { |
615 break; // we've looked at everything, done |
677 break; // we've looked at everything, done |
616 } |
678 } |
617 // New method at the end |
679 // New method at the end |
618 k_new_method = (methodOop) k_new_methods->obj_at(ni); |
680 k_new_method = k_new_methods->at(ni); |
619 method_was = added; |
681 method_was = added; |
620 } else if (ni >= n_new_methods) { |
682 } else if (ni >= n_new_methods) { |
621 // Old method, at the end, is deleted |
683 // Old method, at the end, is deleted |
622 k_old_method = (methodOop) k_old_methods->obj_at(oi); |
684 k_old_method = k_old_methods->at(oi); |
623 method_was = deleted; |
685 method_was = deleted; |
624 } else { |
686 } else { |
625 // There are more methods in both the old and new lists |
687 // There are more methods in both the old and new lists |
626 k_old_method = (methodOop) k_old_methods->obj_at(oi); |
688 k_old_method = k_old_methods->at(oi); |
627 k_new_method = (methodOop) k_new_methods->obj_at(ni); |
689 k_new_method = k_new_methods->at(ni); |
628 if (k_old_method->name() != k_new_method->name()) { |
690 if (k_old_method->name() != k_new_method->name()) { |
629 // Methods are sorted by method name, so a mismatch means added |
691 // Methods are sorted by method name, so a mismatch means added |
630 // or deleted |
692 // or deleted |
631 if (k_old_method->name()->fast_compare(k_new_method->name()) > 0) { |
693 if (k_old_method->name()->fast_compare(k_new_method->name()) > 0) { |
632 method_was = added; |
694 method_was = added; |
639 } else { |
701 } else { |
640 // The name matches, but the signature doesn't, which means we have to |
702 // The name matches, but the signature doesn't, which means we have to |
641 // search forward through the new overloaded methods. |
703 // search forward through the new overloaded methods. |
642 int nj; // outside the loop for post-loop check |
704 int nj; // outside the loop for post-loop check |
643 for (nj = ni + 1; nj < n_new_methods; nj++) { |
705 for (nj = ni + 1; nj < n_new_methods; nj++) { |
644 methodOop m = (methodOop)k_new_methods->obj_at(nj); |
706 Method* m = k_new_methods->at(nj); |
645 if (k_old_method->name() != m->name()) { |
707 if (k_old_method->name() != m->name()) { |
646 // reached another method name so no more overloaded methods |
708 // reached another method name so no more overloaded methods |
647 method_was = deleted; |
709 method_was = deleted; |
648 break; |
710 break; |
649 } |
711 } |
650 if (k_old_method->signature() == m->signature()) { |
712 if (k_old_method->signature() == m->signature()) { |
651 // found a match so swap the methods |
713 // found a match so swap the methods |
652 k_new_methods->obj_at_put(ni, m); |
714 k_new_methods->at_put(ni, m); |
653 k_new_methods->obj_at_put(nj, k_new_method); |
715 k_new_methods->at_put(nj, k_new_method); |
654 k_new_method = m; |
716 k_new_method = m; |
655 method_was = matched; |
717 method_was = matched; |
656 break; |
718 break; |
657 } |
719 } |
658 } |
720 } |
674 } |
736 } |
675 { |
737 { |
676 u2 new_num = k_new_method->method_idnum(); |
738 u2 new_num = k_new_method->method_idnum(); |
677 u2 old_num = k_old_method->method_idnum(); |
739 u2 old_num = k_old_method->method_idnum(); |
678 if (new_num != old_num) { |
740 if (new_num != old_num) { |
679 methodOop idnum_owner = scratch_class->method_with_idnum(old_num); |
741 Method* idnum_owner = scratch_class->method_with_idnum(old_num); |
680 if (idnum_owner != NULL) { |
742 if (idnum_owner != NULL) { |
681 // There is already a method assigned this idnum -- switch them |
743 // There is already a method assigned this idnum -- switch them |
682 idnum_owner->set_method_idnum(new_num); |
744 idnum_owner->set_method_idnum(new_num); |
683 } |
745 } |
684 k_new_method->set_method_idnum(old_num); |
746 k_new_method->set_method_idnum(old_num); |
685 swap_all_method_annotations(old_num, new_num, scratch_class); |
747 swap_all_method_annotations(old_num, new_num, scratch_class, thread); |
|
748 if (thread->has_pending_exception()) { |
|
749 return JVMTI_ERROR_OUT_OF_MEMORY; |
|
750 } |
686 } |
751 } |
687 } |
752 } |
688 RC_TRACE(0x00008000, ("Method matched: new: %s [%d] == old: %s [%d]", |
753 RC_TRACE(0x00008000, ("Method matched: new: %s [%d] == old: %s [%d]", |
689 k_new_method->name_and_sig_as_C_string(), ni, |
754 k_new_method->name_and_sig_as_C_string(), ni, |
690 k_old_method->name_and_sig_as_C_string(), oi)); |
755 k_old_method->name_and_sig_as_C_string(), oi)); |
702 // new methods must be private |
767 // new methods must be private |
703 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED; |
768 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED; |
704 } |
769 } |
705 { |
770 { |
706 u2 num = the_class->next_method_idnum(); |
771 u2 num = the_class->next_method_idnum(); |
707 if (num == constMethodOopDesc::UNSET_IDNUM) { |
772 if (num == ConstMethod::UNSET_IDNUM) { |
708 // cannot add any more methods |
773 // cannot add any more methods |
709 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED; |
774 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED; |
710 } |
775 } |
711 u2 new_num = k_new_method->method_idnum(); |
776 u2 new_num = k_new_method->method_idnum(); |
712 methodOop idnum_owner = scratch_class->method_with_idnum(num); |
777 Method* idnum_owner = scratch_class->method_with_idnum(num); |
713 if (idnum_owner != NULL) { |
778 if (idnum_owner != NULL) { |
714 // There is already a method assigned this idnum -- switch them |
779 // There is already a method assigned this idnum -- switch them |
715 idnum_owner->set_method_idnum(new_num); |
780 idnum_owner->set_method_idnum(new_num); |
716 } |
781 } |
717 k_new_method->set_method_idnum(num); |
782 k_new_method->set_method_idnum(num); |
718 swap_all_method_annotations(new_num, num, scratch_class); |
783 swap_all_method_annotations(new_num, num, scratch_class, thread); |
|
784 if (thread->has_pending_exception()) { |
|
785 return JVMTI_ERROR_OUT_OF_MEMORY; |
|
786 } |
719 } |
787 } |
720 RC_TRACE(0x00008000, ("Method added: new: %s [%d]", |
788 RC_TRACE(0x00008000, ("Method added: new: %s [%d]", |
721 k_new_method->name_and_sig_as_C_string(), ni)); |
789 k_new_method->name_and_sig_as_C_string(), ni)); |
722 ++ni; // advance to next new method |
790 ++ni; // advance to next new method |
723 break; |
791 break; |
797 |
865 |
798 return true; // made it through the gauntlet; this is our special case |
866 return true; // made it through the gauntlet; this is our special case |
799 } // end is_unresolved_class_mismatch() |
867 } // end is_unresolved_class_mismatch() |
800 |
868 |
801 |
869 |
802 // Returns true if the current mismatch is due to a resolved/unresolved |
|
803 // string pair. Otherwise, returns false. |
|
804 bool VM_RedefineClasses::is_unresolved_string_mismatch(constantPoolHandle cp1, |
|
805 int index1, constantPoolHandle cp2, int index2) { |
|
806 |
|
807 jbyte t1 = cp1->tag_at(index1).value(); |
|
808 if (t1 != JVM_CONSTANT_String && t1 != JVM_CONSTANT_UnresolvedString) { |
|
809 return false; // wrong entry type; not our special case |
|
810 } |
|
811 |
|
812 jbyte t2 = cp2->tag_at(index2).value(); |
|
813 if (t2 != JVM_CONSTANT_String && t2 != JVM_CONSTANT_UnresolvedString) { |
|
814 return false; // wrong entry type; not our special case |
|
815 } |
|
816 |
|
817 if (t1 == t2) { |
|
818 return false; // not a mismatch; not our special case |
|
819 } |
|
820 |
|
821 char *s1 = cp1->string_at_noresolve(index1); |
|
822 char *s2 = cp2->string_at_noresolve(index2); |
|
823 if (strcmp(s1, s2) != 0) { |
|
824 return false; // strings don't match; not our special case |
|
825 } |
|
826 |
|
827 return true; // made it through the gauntlet; this is our special case |
|
828 } // end is_unresolved_string_mismatch() |
|
829 |
|
830 |
|
831 jvmtiError VM_RedefineClasses::load_new_class_versions(TRAPS) { |
870 jvmtiError VM_RedefineClasses::load_new_class_versions(TRAPS) { |
|
871 |
832 // For consistency allocate memory using os::malloc wrapper. |
872 // For consistency allocate memory using os::malloc wrapper. |
833 _scratch_classes = (instanceKlassHandle *) |
873 _scratch_classes = (Klass**) |
834 os::malloc(sizeof(instanceKlassHandle) * _class_count, mtInternal); |
874 os::malloc(sizeof(Klass*) * _class_count, mtClass); |
835 if (_scratch_classes == NULL) { |
875 if (_scratch_classes == NULL) { |
836 return JVMTI_ERROR_OUT_OF_MEMORY; |
876 return JVMTI_ERROR_OUT_OF_MEMORY; |
|
877 } |
|
878 // Zero initialize the _scratch_classes array. |
|
879 for (int i = 0; i < _class_count; i++) { |
|
880 _scratch_classes[i] = NULL; |
837 } |
881 } |
838 |
882 |
839 ResourceMark rm(THREAD); |
883 ResourceMark rm(THREAD); |
840 |
884 |
841 JvmtiThreadState *state = JvmtiThreadState::state_for(JavaThread::current()); |
885 JvmtiThreadState *state = JvmtiThreadState::state_for(JavaThread::current()); |
842 // state can only be NULL if the current thread is exiting which |
886 // state can only be NULL if the current thread is exiting which |
843 // should not happen since we're trying to do a RedefineClasses |
887 // should not happen since we're trying to do a RedefineClasses |
844 guarantee(state != NULL, "exiting thread calling load_new_class_versions"); |
888 guarantee(state != NULL, "exiting thread calling load_new_class_versions"); |
845 for (int i = 0; i < _class_count; i++) { |
889 for (int i = 0; i < _class_count; i++) { |
|
890 // Create HandleMark so that any handles created while loading new class |
|
891 // versions are deleted. Constant pools are deallocated while merging |
|
892 // constant pools |
|
893 HandleMark hm(THREAD); |
|
894 |
846 oop mirror = JNIHandles::resolve_non_null(_class_defs[i].klass); |
895 oop mirror = JNIHandles::resolve_non_null(_class_defs[i].klass); |
847 // classes for primitives cannot be redefined |
896 // classes for primitives cannot be redefined |
848 if (!is_modifiable_class(mirror)) { |
897 if (!is_modifiable_class(mirror)) { |
849 return JVMTI_ERROR_UNMODIFIABLE_CLASS; |
898 return JVMTI_ERROR_UNMODIFIABLE_CLASS; |
850 } |
899 } |
851 klassOop the_class_oop = java_lang_Class::as_klassOop(mirror); |
900 Klass* the_class_oop = java_lang_Class::as_Klass(mirror); |
852 instanceKlassHandle the_class = instanceKlassHandle(THREAD, the_class_oop); |
901 instanceKlassHandle the_class = instanceKlassHandle(THREAD, the_class_oop); |
853 Symbol* the_class_sym = the_class->name(); |
902 Symbol* the_class_sym = the_class->name(); |
854 |
903 |
855 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
904 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
856 RC_TRACE_WITH_THREAD(0x00000001, THREAD, |
905 RC_TRACE_WITH_THREAD(0x00000001, THREAD, |
879 |
928 |
880 // TODO: if this is retransform, and nothing changed we can skip it |
929 // TODO: if this is retransform, and nothing changed we can skip it |
881 |
930 |
882 instanceKlassHandle scratch_class (THREAD, k); |
931 instanceKlassHandle scratch_class (THREAD, k); |
883 |
932 |
|
933 // Need to clean up allocated InstanceKlass if there's an error so assign |
|
934 // the result here. Caller deallocates all the scratch classes in case of |
|
935 // an error. |
|
936 _scratch_classes[i] = k; |
|
937 |
884 if (HAS_PENDING_EXCEPTION) { |
938 if (HAS_PENDING_EXCEPTION) { |
885 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name(); |
939 Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); |
886 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
940 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
887 RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("parse_stream exception: '%s'", |
941 RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("parse_stream exception: '%s'", |
888 ex_name->as_C_string())); |
942 ex_name->as_C_string())); |
889 CLEAR_PENDING_EXCEPTION; |
943 CLEAR_PENDING_EXCEPTION; |
890 |
944 |
906 |
960 |
907 // Ensure class is linked before redefine |
961 // Ensure class is linked before redefine |
908 if (!the_class->is_linked()) { |
962 if (!the_class->is_linked()) { |
909 the_class->link_class(THREAD); |
963 the_class->link_class(THREAD); |
910 if (HAS_PENDING_EXCEPTION) { |
964 if (HAS_PENDING_EXCEPTION) { |
911 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name(); |
965 Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); |
912 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
966 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
913 RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("link_class exception: '%s'", |
967 RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("link_class exception: '%s'", |
914 ex_name->as_C_string())); |
968 ex_name->as_C_string())); |
915 CLEAR_PENDING_EXCEPTION; |
969 CLEAR_PENDING_EXCEPTION; |
916 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { |
970 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { |
970 RedefineVerifyMark rvm(&the_class, &scratch_class, state); |
1024 RedefineVerifyMark rvm(&the_class, &scratch_class, state); |
971 Verifier::verify(scratch_class, Verifier::ThrowException, true, THREAD); |
1025 Verifier::verify(scratch_class, Verifier::ThrowException, true, THREAD); |
972 } |
1026 } |
973 |
1027 |
974 if (HAS_PENDING_EXCEPTION) { |
1028 if (HAS_PENDING_EXCEPTION) { |
975 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name(); |
1029 Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); |
976 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
1030 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
977 RC_TRACE_WITH_THREAD(0x00000002, THREAD, |
1031 RC_TRACE_WITH_THREAD(0x00000002, THREAD, |
978 ("verify_byte_codes post merge-CP exception: '%s'", |
1032 ("verify_byte_codes post merge-CP exception: '%s'", |
979 ex_name->as_C_string())); |
1033 ex_name->as_C_string())); |
980 CLEAR_PENDING_EXCEPTION; |
1034 CLEAR_PENDING_EXCEPTION; |
990 Rewriter::rewrite(scratch_class, THREAD); |
1044 Rewriter::rewrite(scratch_class, THREAD); |
991 if (!HAS_PENDING_EXCEPTION) { |
1045 if (!HAS_PENDING_EXCEPTION) { |
992 Rewriter::relocate_and_link(scratch_class, THREAD); |
1046 Rewriter::relocate_and_link(scratch_class, THREAD); |
993 } |
1047 } |
994 if (HAS_PENDING_EXCEPTION) { |
1048 if (HAS_PENDING_EXCEPTION) { |
995 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name(); |
1049 Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); |
996 CLEAR_PENDING_EXCEPTION; |
1050 CLEAR_PENDING_EXCEPTION; |
997 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { |
1051 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { |
998 return JVMTI_ERROR_OUT_OF_MEMORY; |
1052 return JVMTI_ERROR_OUT_OF_MEMORY; |
999 } else { |
1053 } else { |
1000 return JVMTI_ERROR_INTERNAL; |
1054 return JVMTI_ERROR_INTERNAL; |
1001 } |
1055 } |
1002 } |
1056 } |
1003 |
|
1004 _scratch_classes[i] = scratch_class; |
|
1005 |
1057 |
1006 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
1058 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark |
1007 RC_TRACE_WITH_THREAD(0x00000001, THREAD, |
1059 RC_TRACE_WITH_THREAD(0x00000001, THREAD, |
1008 ("loaded name=%s (avail_mem=" UINT64_FORMAT "K)", |
1060 ("loaded name=%s (avail_mem=" UINT64_FORMAT "K)", |
1009 the_class->external_name(), os::available_memory() >> 10)); |
1061 the_class->external_name(), os::available_memory() >> 10)); |
1045 bool VM_RedefineClasses::merge_constant_pools(constantPoolHandle old_cp, |
1097 bool VM_RedefineClasses::merge_constant_pools(constantPoolHandle old_cp, |
1046 constantPoolHandle scratch_cp, constantPoolHandle *merge_cp_p, |
1098 constantPoolHandle scratch_cp, constantPoolHandle *merge_cp_p, |
1047 int *merge_cp_length_p, TRAPS) { |
1099 int *merge_cp_length_p, TRAPS) { |
1048 |
1100 |
1049 if (merge_cp_p == NULL) { |
1101 if (merge_cp_p == NULL) { |
1050 assert(false, "caller must provide scatch constantPool"); |
1102 assert(false, "caller must provide scratch constantPool"); |
1051 return false; // robustness |
1103 return false; // robustness |
1052 } |
1104 } |
1053 if (merge_cp_length_p == NULL) { |
1105 if (merge_cp_length_p == NULL) { |
1054 assert(false, "caller must provide scatch CP length"); |
1106 assert(false, "caller must provide scratch CP length"); |
1055 return false; // robustness |
1107 return false; // robustness |
1056 } |
1108 } |
1057 // Worst case we need old_cp->length() + scratch_cp()->length(), |
1109 // Worst case we need old_cp->length() + scratch_cp()->length(), |
1058 // but the caller might be smart so make sure we have at least |
1110 // but the caller might be smart so make sure we have at least |
1059 // the minimum. |
1111 // the minimum. |
1093 |
1145 |
1094 case JVM_CONSTANT_Double: |
1146 case JVM_CONSTANT_Double: |
1095 case JVM_CONSTANT_Long: |
1147 case JVM_CONSTANT_Long: |
1096 // just copy the entry to *merge_cp_p, but double and long take |
1148 // just copy the entry to *merge_cp_p, but double and long take |
1097 // two constant pool entries |
1149 // two constant pool entries |
1098 constantPoolOopDesc::copy_entry_to(old_cp, old_i, *merge_cp_p, old_i, CHECK_0); |
1150 ConstantPool::copy_entry_to(old_cp, old_i, *merge_cp_p, old_i, CHECK_0); |
1099 old_i++; |
1151 old_i++; |
1100 break; |
1152 break; |
1101 |
1153 |
1102 default: |
1154 default: |
1103 // just copy the entry to *merge_cp_p |
1155 // just copy the entry to *merge_cp_p |
1104 constantPoolOopDesc::copy_entry_to(old_cp, old_i, *merge_cp_p, old_i, CHECK_0); |
1156 ConstantPool::copy_entry_to(old_cp, old_i, *merge_cp_p, old_i, CHECK_0); |
1105 break; |
1157 break; |
1106 } |
1158 } |
1107 } // end for each old_cp entry |
1159 } // end for each old_cp entry |
1108 |
1160 |
1109 // We don't need to sanity check that *merge_cp_length_p is within |
1161 // We don't need to sanity check that *merge_cp_length_p is within |
1231 |
1276 |
1232 return true; |
1277 return true; |
1233 } // end merge_constant_pools() |
1278 } // end merge_constant_pools() |
1234 |
1279 |
1235 |
1280 |
|
1281 // Scoped object to clean up the constant pool(s) created for merging |
|
1282 class MergeCPCleaner { |
|
1283 ClassLoaderData* _loader_data; |
|
1284 ConstantPool* _cp; |
|
1285 ConstantPool* _scratch_cp; |
|
1286 public: |
|
1287 MergeCPCleaner(ClassLoaderData* loader_data, ConstantPool* merge_cp) : |
|
1288 _loader_data(loader_data), _cp(merge_cp), _scratch_cp(NULL) {} |
|
1289 ~MergeCPCleaner() { |
|
1290 _loader_data->add_to_deallocate_list(_cp); |
|
1291 if (_scratch_cp != NULL) { |
|
1292 _loader_data->add_to_deallocate_list(_scratch_cp); |
|
1293 } |
|
1294 } |
|
1295 void add_scratch_cp(ConstantPool* scratch_cp) { _scratch_cp = scratch_cp; } |
|
1296 }; |
|
1297 |
1236 // Merge constant pools between the_class and scratch_class and |
1298 // Merge constant pools between the_class and scratch_class and |
1237 // potentially rewrite bytecodes in scratch_class to use the merged |
1299 // potentially rewrite bytecodes in scratch_class to use the merged |
1238 // constant pool. |
1300 // constant pool. |
1239 jvmtiError VM_RedefineClasses::merge_cp_and_rewrite( |
1301 jvmtiError VM_RedefineClasses::merge_cp_and_rewrite( |
1240 instanceKlassHandle the_class, instanceKlassHandle scratch_class, |
1302 instanceKlassHandle the_class, instanceKlassHandle scratch_class, |
1241 TRAPS) { |
1303 TRAPS) { |
1242 // worst case merged constant pool length is old and new combined |
1304 // worst case merged constant pool length is old and new combined |
1243 int merge_cp_length = the_class->constants()->length() |
1305 int merge_cp_length = the_class->constants()->length() |
1244 + scratch_class->constants()->length(); |
1306 + scratch_class->constants()->length(); |
1245 |
1307 |
1246 constantPoolHandle old_cp(THREAD, the_class->constants()); |
|
1247 constantPoolHandle scratch_cp(THREAD, scratch_class->constants()); |
|
1248 |
|
1249 // Constant pools are not easily reused so we allocate a new one |
1308 // Constant pools are not easily reused so we allocate a new one |
1250 // each time. |
1309 // each time. |
1251 // merge_cp is created unsafe for concurrent GC processing. It |
1310 // merge_cp is created unsafe for concurrent GC processing. It |
1252 // should be marked safe before discarding it. Even though |
1311 // should be marked safe before discarding it. Even though |
1253 // garbage, if it crosses a card boundary, it may be scanned |
1312 // garbage, if it crosses a card boundary, it may be scanned |
1254 // in order to find the start of the first complete object on the card. |
1313 // in order to find the start of the first complete object on the card. |
1255 constantPoolHandle merge_cp(THREAD, |
1314 ClassLoaderData* loader_data = the_class->class_loader_data(); |
1256 oopFactory::new_constantPool(merge_cp_length, |
1315 ConstantPool* merge_cp_oop = |
1257 oopDesc::IsUnsafeConc, |
1316 ConstantPool::allocate(loader_data, |
1258 THREAD)); |
1317 merge_cp_length, |
|
1318 THREAD); |
|
1319 MergeCPCleaner cp_cleaner(loader_data, merge_cp_oop); |
|
1320 |
|
1321 HandleMark hm(THREAD); // make sure handles are cleared before |
|
1322 // MergeCPCleaner clears out merge_cp_oop |
|
1323 constantPoolHandle merge_cp(THREAD, merge_cp_oop); |
|
1324 |
|
1325 // Get constants() from the old class because it could have been rewritten |
|
1326 // while we were at a safepoint allocating a new constant pool. |
|
1327 constantPoolHandle old_cp(THREAD, the_class->constants()); |
|
1328 constantPoolHandle scratch_cp(THREAD, scratch_class->constants()); |
|
1329 |
|
1330 // If the length changed, the class was redefined out from under us. Return |
|
1331 // an error. |
|
1332 if (merge_cp_length != the_class->constants()->length() |
|
1333 + scratch_class->constants()->length()) { |
|
1334 return JVMTI_ERROR_INTERNAL; |
|
1335 } |
|
1336 |
1259 int orig_length = old_cp->orig_length(); |
1337 int orig_length = old_cp->orig_length(); |
1260 if (orig_length == 0) { |
1338 if (orig_length == 0) { |
1261 // This old_cp is an actual original constant pool. We save |
1339 // This old_cp is an actual original constant pool. We save |
1262 // the original length in the merged constant pool so that |
1340 // the original length in the merged constant pool so that |
1263 // merge_constant_pools() can be more efficient. If a constant |
1341 // merge_constant_pools() can be more efficient. If a constant |
1296 // constant pool has not gone through link resolution nor have |
1374 // constant pool has not gone through link resolution nor have |
1297 // the new class bytecodes gone through constant pool cache |
1375 // the new class bytecodes gone through constant pool cache |
1298 // rewriting so we can't use the old constant pool with the new |
1376 // rewriting so we can't use the old constant pool with the new |
1299 // class. |
1377 // class. |
1300 |
1378 |
1301 merge_cp()->set_is_conc_safe(true); |
1379 // toss the merged constant pool at return |
1302 merge_cp = constantPoolHandle(); // toss the merged constant pool |
|
1303 } else if (old_cp->length() < scratch_cp->length()) { |
1380 } else if (old_cp->length() < scratch_cp->length()) { |
1304 // The old constant pool has fewer entries than the new constant |
1381 // The old constant pool has fewer entries than the new constant |
1305 // pool and the index map is empty. This means the new constant |
1382 // pool and the index map is empty. This means the new constant |
1306 // pool is a superset of the old constant pool. However, the old |
1383 // pool is a superset of the old constant pool. However, the old |
1307 // class bytecodes have already gone through constant pool cache |
1384 // class bytecodes have already gone through constant pool cache |
1308 // rewriting so we can't use the new constant pool with the old |
1385 // rewriting so we can't use the new constant pool with the old |
1309 // class. |
1386 // class. |
1310 |
1387 |
1311 merge_cp()->set_is_conc_safe(true); |
1388 // toss the merged constant pool at return |
1312 merge_cp = constantPoolHandle(); // toss the merged constant pool |
|
1313 } else { |
1389 } else { |
1314 // The old constant pool has more entries than the new constant |
1390 // The old constant pool has more entries than the new constant |
1315 // pool and the index map is empty. This means that both the old |
1391 // pool and the index map is empty. This means that both the old |
1316 // and merged constant pools are supersets of the new constant |
1392 // and merged constant pools are supersets of the new constant |
1317 // pool. |
1393 // pool. |
1318 |
1394 |
1319 // Replace the new constant pool with a shrunken copy of the |
1395 // Replace the new constant pool with a shrunken copy of the |
1320 // merged constant pool; the previous new constant pool will |
1396 // merged constant pool |
1321 // get GCed. |
1397 set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length, THREAD); |
1322 set_new_constant_pool(scratch_class, merge_cp, merge_cp_length, true, |
1398 // The new constant pool replaces scratch_cp so have cleaner clean it up. |
1323 THREAD); |
1399 // It can't be cleaned up while there are handles to it. |
1324 // drop local ref to the merged constant pool |
1400 cp_cleaner.add_scratch_cp(scratch_cp()); |
1325 merge_cp()->set_is_conc_safe(true); |
|
1326 merge_cp = constantPoolHandle(); |
|
1327 } |
1401 } |
1328 } else { |
1402 } else { |
1329 if (RC_TRACE_ENABLED(0x00040000)) { |
1403 if (RC_TRACE_ENABLED(0x00040000)) { |
1330 // don't want to loop unless we are tracing |
1404 // don't want to loop unless we are tracing |
1331 int count = 0; |
1405 int count = 0; |
1348 |
1422 |
1349 // Replace the new constant pool with a shrunken copy of the |
1423 // Replace the new constant pool with a shrunken copy of the |
1350 // merged constant pool so now the rewritten bytecodes have |
1424 // merged constant pool so now the rewritten bytecodes have |
1351 // valid references; the previous new constant pool will get |
1425 // valid references; the previous new constant pool will get |
1352 // GCed. |
1426 // GCed. |
1353 set_new_constant_pool(scratch_class, merge_cp, merge_cp_length, true, |
1427 set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length, THREAD); |
1354 THREAD); |
1428 // The new constant pool replaces scratch_cp so have cleaner clean it up. |
1355 merge_cp()->set_is_conc_safe(true); |
1429 // It can't be cleaned up while there are handles to it. |
1356 } |
1430 cp_cleaner.add_scratch_cp(scratch_cp()); |
1357 assert(old_cp()->is_conc_safe(), "Just checking"); |
1431 } |
1358 assert(scratch_cp()->is_conc_safe(), "Just checking"); |
|
1359 |
1432 |
1360 return JVMTI_ERROR_NONE; |
1433 return JVMTI_ERROR_NONE; |
1361 } // end merge_cp_and_rewrite() |
1434 } // end merge_cp_and_rewrite() |
1362 |
1435 |
1363 |
1436 |
1409 |
1482 |
1410 // Rewrite constant pool references in the methods. |
1483 // Rewrite constant pool references in the methods. |
1411 bool VM_RedefineClasses::rewrite_cp_refs_in_methods( |
1484 bool VM_RedefineClasses::rewrite_cp_refs_in_methods( |
1412 instanceKlassHandle scratch_class, TRAPS) { |
1485 instanceKlassHandle scratch_class, TRAPS) { |
1413 |
1486 |
1414 objArrayHandle methods(THREAD, scratch_class->methods()); |
1487 Array<Method*>* methods = scratch_class->methods(); |
1415 |
1488 |
1416 if (methods.is_null() || methods->length() == 0) { |
1489 if (methods == NULL || methods->length() == 0) { |
1417 // no methods so nothing to do |
1490 // no methods so nothing to do |
1418 return true; |
1491 return true; |
1419 } |
1492 } |
1420 |
1493 |
1421 // rewrite constant pool references in the methods: |
1494 // rewrite constant pool references in the methods: |
1422 for (int i = methods->length() - 1; i >= 0; i--) { |
1495 for (int i = methods->length() - 1; i >= 0; i--) { |
1423 methodHandle method(THREAD, (methodOop)methods->obj_at(i)); |
1496 methodHandle method(THREAD, methods->at(i)); |
1424 methodHandle new_method; |
1497 methodHandle new_method; |
1425 rewrite_cp_refs_in_method(method, &new_method, CHECK_false); |
1498 rewrite_cp_refs_in_method(method, &new_method, CHECK_false); |
1426 if (!new_method.is_null()) { |
1499 if (!new_method.is_null()) { |
1427 // the method has been replaced so save the new method version |
1500 // the method has been replaced so save the new method version |
1428 methods->obj_at_put(i, new_method()); |
1501 methods->at_put(i, new_method()); |
1429 } |
1502 } |
1430 } |
1503 } |
1431 |
1504 |
1432 return true; |
1505 return true; |
1433 } |
1506 } |
1594 // u2 num_annotations; |
1666 // u2 num_annotations; |
1595 // annotation annotations[num_annotations]; |
1667 // annotation annotations[num_annotations]; |
1596 // } |
1668 // } |
1597 // |
1669 // |
1598 bool VM_RedefineClasses::rewrite_cp_refs_in_annotations_typeArray( |
1670 bool VM_RedefineClasses::rewrite_cp_refs_in_annotations_typeArray( |
1599 typeArrayHandle annotations_typeArray, int &byte_i_ref, TRAPS) { |
1671 AnnotationArray* annotations_typeArray, int &byte_i_ref, TRAPS) { |
1600 |
1672 |
1601 if ((byte_i_ref + 2) > annotations_typeArray->length()) { |
1673 if ((byte_i_ref + 2) > annotations_typeArray->length()) { |
1602 // not enough room for num_annotations field |
1674 // not enough room for num_annotations field |
1603 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1675 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1604 ("length() is too small for num_annotations field")); |
1676 ("length() is too small for num_annotations field")); |
1605 return false; |
1677 return false; |
1606 } |
1678 } |
1607 |
1679 |
1608 u2 num_annotations = Bytes::get_Java_u2((address) |
1680 u2 num_annotations = Bytes::get_Java_u2((address) |
1609 annotations_typeArray->byte_at_addr(byte_i_ref)); |
1681 annotations_typeArray->adr_at(byte_i_ref)); |
1610 byte_i_ref += 2; |
1682 byte_i_ref += 2; |
1611 |
1683 |
1612 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1684 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1613 ("num_annotations=%d", num_annotations)); |
1685 ("num_annotations=%d", num_annotations)); |
1614 |
1686 |
1698 // Rewrite a constant pool reference at the current position in |
1769 // Rewrite a constant pool reference at the current position in |
1699 // annotations_typeArray if needed. Returns the original constant |
1770 // annotations_typeArray if needed. Returns the original constant |
1700 // pool reference if a rewrite was not needed or the new constant |
1771 // pool reference if a rewrite was not needed or the new constant |
1701 // pool reference if a rewrite was needed. |
1772 // pool reference if a rewrite was needed. |
1702 u2 VM_RedefineClasses::rewrite_cp_ref_in_annotation_data( |
1773 u2 VM_RedefineClasses::rewrite_cp_ref_in_annotation_data( |
1703 typeArrayHandle annotations_typeArray, int &byte_i_ref, |
1774 AnnotationArray* annotations_typeArray, int &byte_i_ref, |
1704 const char * trace_mesg, TRAPS) { |
1775 const char * trace_mesg, TRAPS) { |
1705 |
1776 |
1706 address cp_index_addr = (address) |
1777 address cp_index_addr = (address) |
1707 annotations_typeArray->byte_at_addr(byte_i_ref); |
1778 annotations_typeArray->adr_at(byte_i_ref); |
1708 u2 old_cp_index = Bytes::get_Java_u2(cp_index_addr); |
1779 u2 old_cp_index = Bytes::get_Java_u2(cp_index_addr); |
1709 u2 new_cp_index = find_new_index(old_cp_index); |
1780 u2 new_cp_index = find_new_index(old_cp_index); |
1710 if (new_cp_index != 0) { |
1781 if (new_cp_index != 0) { |
1711 RC_TRACE_WITH_THREAD(0x02000000, THREAD, (trace_mesg, old_cp_index)); |
1782 RC_TRACE_WITH_THREAD(0x02000000, THREAD, (trace_mesg, old_cp_index)); |
1712 Bytes::put_Java_u2(cp_index_addr, new_cp_index); |
1783 Bytes::put_Java_u2(cp_index_addr, new_cp_index); |
1737 // } array_value; |
1808 // } array_value; |
1738 // } value; |
1809 // } value; |
1739 // } |
1810 // } |
1740 // |
1811 // |
1741 bool VM_RedefineClasses::rewrite_cp_refs_in_element_value( |
1812 bool VM_RedefineClasses::rewrite_cp_refs_in_element_value( |
1742 typeArrayHandle annotations_typeArray, int &byte_i_ref, TRAPS) { |
1813 AnnotationArray* annotations_typeArray, int &byte_i_ref, TRAPS) { |
1743 |
1814 |
1744 if ((byte_i_ref + 1) > annotations_typeArray->length()) { |
1815 if ((byte_i_ref + 1) > annotations_typeArray->length()) { |
1745 // not enough room for a tag let alone the rest of an element_value |
1816 // not enough room for a tag let alone the rest of an element_value |
1746 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1817 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1747 ("length() is too small for a tag")); |
1818 ("length() is too small for a tag")); |
1748 return false; |
1819 return false; |
1749 } |
1820 } |
1750 |
1821 |
1751 u1 tag = annotations_typeArray->byte_at(byte_i_ref); |
1822 u1 tag = annotations_typeArray->at(byte_i_ref); |
1752 byte_i_ref++; |
1823 byte_i_ref++; |
1753 RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("tag='%c'", tag)); |
1824 RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("tag='%c'", tag)); |
1754 |
1825 |
1755 switch (tag) { |
1826 switch (tag) { |
1756 // These BaseType tag values are from Table 4.2 in VM spec: |
1827 // These BaseType tag values are from Table 4.2 in VM spec: |
1878 |
1949 |
1879 // Rewrite constant pool references in a fields_annotations field. |
1950 // Rewrite constant pool references in a fields_annotations field. |
1880 bool VM_RedefineClasses::rewrite_cp_refs_in_fields_annotations( |
1951 bool VM_RedefineClasses::rewrite_cp_refs_in_fields_annotations( |
1881 instanceKlassHandle scratch_class, TRAPS) { |
1952 instanceKlassHandle scratch_class, TRAPS) { |
1882 |
1953 |
1883 objArrayHandle fields_annotations(THREAD, |
1954 Annotations* sca = scratch_class->annotations(); |
1884 scratch_class->fields_annotations()); |
1955 if (sca == NULL) return true; |
1885 |
1956 |
1886 if (fields_annotations.is_null() || fields_annotations->length() == 0) { |
1957 Array<AnnotationArray*>* fields_annotations = sca->fields_annotations(); |
|
1958 |
|
1959 if (fields_annotations == NULL || fields_annotations->length() == 0) { |
1887 // no fields_annotations so nothing to do |
1960 // no fields_annotations so nothing to do |
1888 return true; |
1961 return true; |
1889 } |
1962 } |
1890 |
1963 |
1891 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1964 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1892 ("fields_annotations length=%d", fields_annotations->length())); |
1965 ("fields_annotations length=%d", fields_annotations->length())); |
1893 |
1966 |
1894 for (int i = 0; i < fields_annotations->length(); i++) { |
1967 for (int i = 0; i < fields_annotations->length(); i++) { |
1895 typeArrayHandle field_annotations(THREAD, |
1968 AnnotationArray* field_annotations = fields_annotations->at(i); |
1896 (typeArrayOop)fields_annotations->obj_at(i)); |
1969 if (field_annotations == NULL || field_annotations->length() == 0) { |
1897 if (field_annotations.is_null() || field_annotations->length() == 0) { |
|
1898 // this field does not have any annotations so skip it |
1970 // this field does not have any annotations so skip it |
1899 continue; |
1971 continue; |
1900 } |
1972 } |
1901 |
1973 |
1902 int byte_i = 0; // byte index into field_annotations |
1974 int byte_i = 0; // byte index into field_annotations |
1915 |
1987 |
1916 // Rewrite constant pool references in a methods_annotations field. |
1988 // Rewrite constant pool references in a methods_annotations field. |
1917 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_annotations( |
1989 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_annotations( |
1918 instanceKlassHandle scratch_class, TRAPS) { |
1990 instanceKlassHandle scratch_class, TRAPS) { |
1919 |
1991 |
1920 objArrayHandle methods_annotations(THREAD, |
1992 Annotations* sca = scratch_class->annotations(); |
1921 scratch_class->methods_annotations()); |
1993 if (sca == NULL) return true; |
1922 |
1994 |
1923 if (methods_annotations.is_null() || methods_annotations->length() == 0) { |
1995 Array<AnnotationArray*>* methods_annotations = sca->methods_annotations(); |
|
1996 |
|
1997 if (methods_annotations == NULL || methods_annotations->length() == 0) { |
1924 // no methods_annotations so nothing to do |
1998 // no methods_annotations so nothing to do |
1925 return true; |
1999 return true; |
1926 } |
2000 } |
1927 |
2001 |
1928 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
2002 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1929 ("methods_annotations length=%d", methods_annotations->length())); |
2003 ("methods_annotations length=%d", methods_annotations->length())); |
1930 |
2004 |
1931 for (int i = 0; i < methods_annotations->length(); i++) { |
2005 for (int i = 0; i < methods_annotations->length(); i++) { |
1932 typeArrayHandle method_annotations(THREAD, |
2006 AnnotationArray* method_annotations = methods_annotations->at(i); |
1933 (typeArrayOop)methods_annotations->obj_at(i)); |
2007 if (method_annotations == NULL || method_annotations->length() == 0) { |
1934 if (method_annotations.is_null() || method_annotations->length() == 0) { |
|
1935 // this method does not have any annotations so skip it |
2008 // this method does not have any annotations so skip it |
1936 continue; |
2009 continue; |
1937 } |
2010 } |
1938 |
2011 |
1939 int byte_i = 0; // byte index into method_annotations |
2012 int byte_i = 0; // byte index into method_annotations |
1964 // } |
2037 // } |
1965 // |
2038 // |
1966 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_parameter_annotations( |
2039 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_parameter_annotations( |
1967 instanceKlassHandle scratch_class, TRAPS) { |
2040 instanceKlassHandle scratch_class, TRAPS) { |
1968 |
2041 |
1969 objArrayHandle methods_parameter_annotations(THREAD, |
2042 Annotations* sca = scratch_class->annotations(); |
1970 scratch_class->methods_parameter_annotations()); |
2043 if (sca == NULL) return true; |
1971 |
2044 |
1972 if (methods_parameter_annotations.is_null() |
2045 Array<AnnotationArray*>* methods_parameter_annotations = |
|
2046 sca->methods_parameter_annotations(); |
|
2047 |
|
2048 if (methods_parameter_annotations == NULL |
1973 || methods_parameter_annotations->length() == 0) { |
2049 || methods_parameter_annotations->length() == 0) { |
1974 // no methods_parameter_annotations so nothing to do |
2050 // no methods_parameter_annotations so nothing to do |
1975 return true; |
2051 return true; |
1976 } |
2052 } |
1977 |
2053 |
1978 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
2054 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
1979 ("methods_parameter_annotations length=%d", |
2055 ("methods_parameter_annotations length=%d", |
1980 methods_parameter_annotations->length())); |
2056 methods_parameter_annotations->length())); |
1981 |
2057 |
1982 for (int i = 0; i < methods_parameter_annotations->length(); i++) { |
2058 for (int i = 0; i < methods_parameter_annotations->length(); i++) { |
1983 typeArrayHandle method_parameter_annotations(THREAD, |
2059 AnnotationArray* method_parameter_annotations = methods_parameter_annotations->at(i); |
1984 (typeArrayOop)methods_parameter_annotations->obj_at(i)); |
2060 if (method_parameter_annotations == NULL |
1985 if (method_parameter_annotations.is_null() |
|
1986 || method_parameter_annotations->length() == 0) { |
2061 || method_parameter_annotations->length() == 0) { |
1987 // this method does not have any parameter annotations so skip it |
2062 // this method does not have any parameter annotations so skip it |
1988 continue; |
2063 continue; |
1989 } |
2064 } |
1990 |
2065 |
2029 // } |
2104 // } |
2030 // |
2105 // |
2031 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_default_annotations( |
2106 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_default_annotations( |
2032 instanceKlassHandle scratch_class, TRAPS) { |
2107 instanceKlassHandle scratch_class, TRAPS) { |
2033 |
2108 |
2034 objArrayHandle methods_default_annotations(THREAD, |
2109 Annotations* sca = scratch_class->annotations(); |
2035 scratch_class->methods_default_annotations()); |
2110 if (sca == NULL) return true; |
2036 |
2111 |
2037 if (methods_default_annotations.is_null() |
2112 Array<AnnotationArray*>* methods_default_annotations = |
|
2113 sca->methods_default_annotations(); |
|
2114 |
|
2115 if (methods_default_annotations == NULL |
2038 || methods_default_annotations->length() == 0) { |
2116 || methods_default_annotations->length() == 0) { |
2039 // no methods_default_annotations so nothing to do |
2117 // no methods_default_annotations so nothing to do |
2040 return true; |
2118 return true; |
2041 } |
2119 } |
2042 |
2120 |
2043 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
2121 RC_TRACE_WITH_THREAD(0x02000000, THREAD, |
2044 ("methods_default_annotations length=%d", |
2122 ("methods_default_annotations length=%d", |
2045 methods_default_annotations->length())); |
2123 methods_default_annotations->length())); |
2046 |
2124 |
2047 for (int i = 0; i < methods_default_annotations->length(); i++) { |
2125 for (int i = 0; i < methods_default_annotations->length(); i++) { |
2048 typeArrayHandle method_default_annotations(THREAD, |
2126 AnnotationArray* method_default_annotations = methods_default_annotations->at(i); |
2049 (typeArrayOop)methods_default_annotations->obj_at(i)); |
2127 if (method_default_annotations == NULL |
2050 if (method_default_annotations.is_null() |
|
2051 || method_default_annotations->length() == 0) { |
2128 || method_default_annotations->length() == 0) { |
2052 // this method does not have any default annotations so skip it |
2129 // this method does not have any default annotations so skip it |
2053 continue; |
2130 continue; |
2054 } |
2131 } |
2055 |
2132 |
2333 // Change the constant pool associated with klass scratch_class to |
2410 // Change the constant pool associated with klass scratch_class to |
2334 // scratch_cp. If shrink is true, then scratch_cp_length elements |
2411 // scratch_cp. If shrink is true, then scratch_cp_length elements |
2335 // are copied from scratch_cp to a smaller constant pool and the |
2412 // are copied from scratch_cp to a smaller constant pool and the |
2336 // smaller constant pool is associated with scratch_class. |
2413 // smaller constant pool is associated with scratch_class. |
2337 void VM_RedefineClasses::set_new_constant_pool( |
2414 void VM_RedefineClasses::set_new_constant_pool( |
|
2415 ClassLoaderData* loader_data, |
2338 instanceKlassHandle scratch_class, constantPoolHandle scratch_cp, |
2416 instanceKlassHandle scratch_class, constantPoolHandle scratch_cp, |
2339 int scratch_cp_length, bool shrink, TRAPS) { |
2417 int scratch_cp_length, TRAPS) { |
2340 assert(!shrink || scratch_cp->length() >= scratch_cp_length, "sanity check"); |
2418 assert(scratch_cp->length() >= scratch_cp_length, "sanity check"); |
2341 |
2419 |
2342 if (shrink) { |
|
2343 // scratch_cp is a merged constant pool and has enough space for a |
2420 // scratch_cp is a merged constant pool and has enough space for a |
2344 // worst case merge situation. We want to associate the minimum |
2421 // worst case merge situation. We want to associate the minimum |
2345 // sized constant pool with the klass to save space. |
2422 // sized constant pool with the klass to save space. |
2346 constantPoolHandle smaller_cp(THREAD, |
2423 constantPoolHandle smaller_cp(THREAD, |
2347 oopFactory::new_constantPool(scratch_cp_length, |
2424 ConstantPool::allocate(loader_data, scratch_cp_length, |
2348 oopDesc::IsUnsafeConc, |
|
2349 THREAD)); |
2425 THREAD)); |
2350 // preserve orig_length() value in the smaller copy |
2426 // preserve orig_length() value in the smaller copy |
2351 int orig_length = scratch_cp->orig_length(); |
2427 int orig_length = scratch_cp->orig_length(); |
2352 assert(orig_length != 0, "sanity check"); |
2428 assert(orig_length != 0, "sanity check"); |
2353 smaller_cp->set_orig_length(orig_length); |
2429 smaller_cp->set_orig_length(orig_length); |
2354 scratch_cp->copy_cp_to(1, scratch_cp_length - 1, smaller_cp, 1, THREAD); |
2430 scratch_cp->copy_cp_to(1, scratch_cp_length - 1, smaller_cp, 1, THREAD); |
2355 scratch_cp = smaller_cp; |
2431 scratch_cp = smaller_cp; |
2356 smaller_cp()->set_is_conc_safe(true); |
|
2357 } |
|
2358 |
2432 |
2359 // attach new constant pool to klass |
2433 // attach new constant pool to klass |
2360 scratch_cp->set_pool_holder(scratch_class()); |
2434 scratch_cp->set_pool_holder(scratch_class()); |
2361 |
2435 |
2362 // attach klass to new constant pool |
2436 // attach klass to new constant pool |
2428 } |
2502 } |
2429 } // end for each inner class |
2503 } // end for each inner class |
2430 |
2504 |
2431 // Attach each method in klass to the new constant pool and update |
2505 // Attach each method in klass to the new constant pool and update |
2432 // to use new constant pool indices as needed: |
2506 // to use new constant pool indices as needed: |
2433 objArrayHandle methods(THREAD, scratch_class->methods()); |
2507 Array<Method*>* methods = scratch_class->methods(); |
2434 for (i = methods->length() - 1; i >= 0; i--) { |
2508 for (i = methods->length() - 1; i >= 0; i--) { |
2435 methodHandle method(THREAD, (methodOop)methods->obj_at(i)); |
2509 methodHandle method(THREAD, methods->at(i)); |
2436 method->set_constants(scratch_cp()); |
2510 method->set_constants(scratch_cp()); |
2437 |
2511 |
2438 int new_index = find_new_index(method->name_index()); |
2512 int new_index = find_new_index(method->name_index()); |
2439 if (new_index != 0) { |
2513 if (new_index != 0) { |
2440 RC_TRACE_WITH_THREAD(0x00080000, THREAD, |
2514 RC_TRACE_WITH_THREAD(0x00080000, THREAD, |
2526 } // end for each local variable table entry |
2600 } // end for each local variable table entry |
2527 } // end if there are local variable table entries |
2601 } // end if there are local variable table entries |
2528 |
2602 |
2529 rewrite_cp_refs_in_stack_map_table(method, THREAD); |
2603 rewrite_cp_refs_in_stack_map_table(method, THREAD); |
2530 } // end for each method |
2604 } // end for each method |
2531 assert(scratch_cp()->is_conc_safe(), "Just checking"); |
|
2532 } // end set_new_constant_pool() |
2605 } // end set_new_constant_pool() |
2533 |
2606 |
|
2607 |
|
2608 void VM_RedefineClasses::adjust_array_vtable(Klass* k_oop) { |
|
2609 arrayKlass* ak = arrayKlass::cast(k_oop); |
|
2610 bool trace_name_printed = false; |
|
2611 ak->vtable()->adjust_method_entries(_matching_old_methods, |
|
2612 _matching_new_methods, |
|
2613 _matching_methods_length, |
|
2614 &trace_name_printed); |
|
2615 } |
2534 |
2616 |
2535 // Unevolving classes may point to methods of the_class directly |
2617 // Unevolving classes may point to methods of the_class directly |
2536 // from their constant pool caches, itables, and/or vtables. We |
2618 // from their constant pool caches, itables, and/or vtables. We |
2537 // use the SystemDictionary::classes_do() facility and this helper |
2619 // use the SystemDictionary::classes_do() facility and this helper |
2538 // to fix up these pointers. |
2620 // to fix up these pointers. |
2539 // |
2621 // |
2540 // Note: We currently don't support updating the vtable in |
2622 // Note: We currently don't support updating the vtable in |
2541 // arrayKlassOops. See Open Issues in jvmtiRedefineClasses.hpp. |
2623 // arrayKlassOops. See Open Issues in jvmtiRedefineClasses.hpp. |
2542 void VM_RedefineClasses::adjust_cpool_cache_and_vtable(klassOop k_oop, |
2624 void VM_RedefineClasses::adjust_cpool_cache_and_vtable(Klass* k_oop, |
2543 oop initiating_loader, TRAPS) { |
2625 ClassLoaderData* initiating_loader, |
2544 Klass *k = k_oop->klass_part(); |
2626 TRAPS) { |
|
2627 Klass *k = k_oop; |
2545 if (k->oop_is_instance()) { |
2628 if (k->oop_is_instance()) { |
2546 HandleMark hm(THREAD); |
2629 HandleMark hm(THREAD); |
2547 instanceKlass *ik = (instanceKlass *) k; |
2630 InstanceKlass *ik = (InstanceKlass *) k; |
2548 |
2631 |
2549 // HotSpot specific optimization! HotSpot does not currently |
2632 // HotSpot specific optimization! HotSpot does not currently |
2550 // support delegation from the bootstrap class loader to a |
2633 // support delegation from the bootstrap class loader to a |
2551 // user-defined class loader. This means that if the bootstrap |
2634 // user-defined class loader. This means that if the bootstrap |
2552 // class loader is the initiating class loader, then it will also |
2635 // class loader is the initiating class loader, then it will also |
2557 // |
2640 // |
2558 // If the current class being redefined has a user-defined class |
2641 // If the current class being redefined has a user-defined class |
2559 // loader as its defining class loader, then we can skip all |
2642 // loader as its defining class loader, then we can skip all |
2560 // classes loaded by the bootstrap class loader. |
2643 // classes loaded by the bootstrap class loader. |
2561 bool is_user_defined = |
2644 bool is_user_defined = |
2562 instanceKlass::cast(_the_class_oop)->class_loader() != NULL; |
2645 InstanceKlass::cast(_the_class_oop)->class_loader() != NULL; |
2563 if (is_user_defined && ik->class_loader() == NULL) { |
2646 if (is_user_defined && ik->class_loader() == NULL) { |
2564 return; |
2647 return; |
|
2648 } |
|
2649 |
|
2650 // If the class being redefined is java.lang.Object, we need to fix all |
|
2651 // array class vtables also |
|
2652 if (_the_class_oop == SystemDictionary::Object_klass()) { |
|
2653 ik->array_klasses_do(adjust_array_vtable); |
2565 } |
2654 } |
2566 |
2655 |
2567 // This is a very busy routine. We don't want too much tracing |
2656 // This is a very busy routine. We don't want too much tracing |
2568 // printed out. |
2657 // printed out. |
2569 bool trace_name_printed = false; |
2658 bool trace_name_printed = false; |
2575 // ("adjust check: name=%s", ik->external_name())); |
2664 // ("adjust check: name=%s", ik->external_name())); |
2576 // trace_name_printed = true; |
2665 // trace_name_printed = true; |
2577 |
2666 |
2578 // Fix the vtable embedded in the_class and subclasses of the_class, |
2667 // Fix the vtable embedded in the_class and subclasses of the_class, |
2579 // if one exists. We discard scratch_class and we don't keep an |
2668 // if one exists. We discard scratch_class and we don't keep an |
2580 // instanceKlass around to hold obsolete methods so we don't have |
2669 // InstanceKlass around to hold obsolete methods so we don't have |
2581 // any other instanceKlass embedded vtables to update. The vtable |
2670 // any other InstanceKlass embedded vtables to update. The vtable |
2582 // holds the methodOops for virtual (but not final) methods. |
2671 // holds the Method*s for virtual (but not final) methods. |
2583 if (ik->vtable_length() > 0 && ik->is_subtype_of(_the_class_oop)) { |
2672 if (ik->vtable_length() > 0 && ik->is_subtype_of(_the_class_oop)) { |
2584 // ik->vtable() creates a wrapper object; rm cleans it up |
2673 // ik->vtable() creates a wrapper object; rm cleans it up |
2585 ResourceMark rm(THREAD); |
2674 ResourceMark rm(THREAD); |
2586 ik->vtable()->adjust_method_entries(_matching_old_methods, |
2675 ik->vtable()->adjust_method_entries(_matching_old_methods, |
2587 _matching_new_methods, |
2676 _matching_new_methods, |
2591 |
2680 |
2592 // If the current class has an itable and we are either redefining an |
2681 // If the current class has an itable and we are either redefining an |
2593 // interface or if the current class is a subclass of the_class, then |
2682 // interface or if the current class is a subclass of the_class, then |
2594 // we potentially have to fix the itable. If we are redefining an |
2683 // we potentially have to fix the itable. If we are redefining an |
2595 // interface, then we have to call adjust_method_entries() for |
2684 // interface, then we have to call adjust_method_entries() for |
2596 // every instanceKlass that has an itable since there isn't a |
2685 // every InstanceKlass that has an itable since there isn't a |
2597 // subclass relationship between an interface and an instanceKlass. |
2686 // subclass relationship between an interface and an InstanceKlass. |
2598 if (ik->itable_length() > 0 && (Klass::cast(_the_class_oop)->is_interface() |
2687 if (ik->itable_length() > 0 && (Klass::cast(_the_class_oop)->is_interface() |
2599 || ik->is_subclass_of(_the_class_oop))) { |
2688 || ik->is_subclass_of(_the_class_oop))) { |
2600 // ik->itable() creates a wrapper object; rm cleans it up |
2689 // ik->itable() creates a wrapper object; rm cleans it up |
2601 ResourceMark rm(THREAD); |
2690 ResourceMark rm(THREAD); |
2602 ik->itable()->adjust_method_entries(_matching_old_methods, |
2691 ik->itable()->adjust_method_entries(_matching_old_methods, |
2607 |
2696 |
2608 // The constant pools in other classes (other_cp) can refer to |
2697 // The constant pools in other classes (other_cp) can refer to |
2609 // methods in the_class. We have to update method information in |
2698 // methods in the_class. We have to update method information in |
2610 // other_cp's cache. If other_cp has a previous version, then we |
2699 // other_cp's cache. If other_cp has a previous version, then we |
2611 // have to repeat the process for each previous version. The |
2700 // have to repeat the process for each previous version. The |
2612 // constant pool cache holds the methodOops for non-virtual |
2701 // constant pool cache holds the Method*s for non-virtual |
2613 // methods and for virtual, final methods. |
2702 // methods and for virtual, final methods. |
2614 // |
2703 // |
2615 // Special case: if the current class is the_class, then new_cp |
2704 // Special case: if the current class is the_class, then new_cp |
2616 // has already been attached to the_class and old_cp has already |
2705 // has already been attached to the_class and old_cp has already |
2617 // been added as a previous version. The new_cp doesn't have any |
2706 // been added as a previous version. The new_cp doesn't have any |
2618 // cached references to old methods so it doesn't need to be |
2707 // cached references to old methods so it doesn't need to be |
2619 // updated. We can simply start with the previous version(s) in |
2708 // updated. We can simply start with the previous version(s) in |
2620 // that case. |
2709 // that case. |
2621 constantPoolHandle other_cp; |
2710 constantPoolHandle other_cp; |
2622 constantPoolCacheOop cp_cache; |
2711 ConstantPoolCache* cp_cache; |
2623 |
2712 |
2624 if (k_oop != _the_class_oop) { |
2713 if (k_oop != _the_class_oop) { |
2625 // this klass' constant pool cache may need adjustment |
2714 // this klass' constant pool cache may need adjustment |
2626 other_cp = constantPoolHandle(ik->constants()); |
2715 other_cp = constantPoolHandle(ik->constants()); |
2627 cp_cache = other_cp->cache(); |
2716 cp_cache = other_cp->cache(); |
2675 BitMap *emcp_methods, int * emcp_method_count_p) { |
2764 BitMap *emcp_methods, int * emcp_method_count_p) { |
2676 *emcp_method_count_p = 0; |
2765 *emcp_method_count_p = 0; |
2677 int obsolete_count = 0; |
2766 int obsolete_count = 0; |
2678 int old_index = 0; |
2767 int old_index = 0; |
2679 for (int j = 0; j < _matching_methods_length; ++j, ++old_index) { |
2768 for (int j = 0; j < _matching_methods_length; ++j, ++old_index) { |
2680 methodOop old_method = _matching_old_methods[j]; |
2769 Method* old_method = _matching_old_methods[j]; |
2681 methodOop new_method = _matching_new_methods[j]; |
2770 Method* new_method = _matching_new_methods[j]; |
2682 methodOop old_array_method; |
2771 Method* old_array_method; |
2683 |
2772 |
2684 // Maintain an old_index into the _old_methods array by skipping |
2773 // Maintain an old_index into the _old_methods array by skipping |
2685 // deleted methods |
2774 // deleted methods |
2686 while ((old_array_method = (methodOop) _old_methods->obj_at(old_index)) |
2775 while ((old_array_method = _old_methods->at(old_index)) != old_method) { |
2687 != old_method) { |
|
2688 ++old_index; |
2776 ++old_index; |
2689 } |
2777 } |
2690 |
2778 |
2691 if (MethodComparator::methods_EMCP(old_method, new_method)) { |
2779 if (MethodComparator::methods_EMCP(old_method, new_method)) { |
2692 // The EMCP definition from JSR-163 requires the bytecodes to be |
2780 // The EMCP definition from JSR-163 requires the bytecodes to be |
2716 // then the old method cannot be collected until sometime after |
2804 // then the old method cannot be collected until sometime after |
2717 // the old method call has returned. So the overwriting of old |
2805 // the old method call has returned. So the overwriting of old |
2718 // methods by new methods will save us space except for those |
2806 // methods by new methods will save us space except for those |
2719 // (hopefully few) old methods that are still executing. |
2807 // (hopefully few) old methods that are still executing. |
2720 // |
2808 // |
2721 // A method refers to a constMethodOop and this presents another |
2809 // A method refers to a ConstMethod* and this presents another |
2722 // possible avenue to space savings. The constMethodOop in the |
2810 // possible avenue to space savings. The ConstMethod* in the |
2723 // new method contains possibly new attributes (LNT, LVT, etc). |
2811 // new method contains possibly new attributes (LNT, LVT, etc). |
2724 // At first glance, it seems possible to save space by replacing |
2812 // At first glance, it seems possible to save space by replacing |
2725 // the constMethodOop in the old method with the constMethodOop |
2813 // the ConstMethod* in the old method with the ConstMethod* |
2726 // from the new method. The old and new methods would share the |
2814 // from the new method. The old and new methods would share the |
2727 // same constMethodOop and we would save the space occupied by |
2815 // same ConstMethod* and we would save the space occupied by |
2728 // the old constMethodOop. However, the constMethodOop contains |
2816 // the old ConstMethod*. However, the ConstMethod* contains |
2729 // a back reference to the containing method. Sharing the |
2817 // a back reference to the containing method. Sharing the |
2730 // constMethodOop between two methods could lead to confusion in |
2818 // ConstMethod* between two methods could lead to confusion in |
2731 // the code that uses the back reference. This would lead to |
2819 // the code that uses the back reference. This would lead to |
2732 // brittle code that could be broken in non-obvious ways now or |
2820 // brittle code that could be broken in non-obvious ways now or |
2733 // in the future. |
2821 // in the future. |
2734 // |
2822 // |
2735 // Another possibility is to copy the constMethodOop from the new |
2823 // Another possibility is to copy the ConstMethod* from the new |
2736 // method to the old method and then overwrite the new method with |
2824 // method to the old method and then overwrite the new method with |
2737 // the old method. Since the constMethodOop contains the bytecodes |
2825 // the old method. Since the ConstMethod* contains the bytecodes |
2738 // for the method embedded in the oop, this option would change |
2826 // for the method embedded in the oop, this option would change |
2739 // the bytecodes out from under any threads executing the old |
2827 // the bytecodes out from under any threads executing the old |
2740 // method and make the thread's bcp invalid. Since EMCP requires |
2828 // method and make the thread's bcp invalid. Since EMCP requires |
2741 // that the bytecodes be the same modulo constant pool indices, it |
2829 // that the bytecodes be the same modulo constant pool indices, it |
2742 // is straight forward to compute the correct new bcp in the new |
2830 // is straight forward to compute the correct new bcp in the new |
2743 // constMethodOop from the old bcp in the old constMethodOop. The |
2831 // ConstMethod* from the old bcp in the old ConstMethod*. The |
2744 // time consuming part would be searching all the frames in all |
2832 // time consuming part would be searching all the frames in all |
2745 // of the threads to find all of the calls to the old method. |
2833 // of the threads to find all of the calls to the old method. |
2746 // |
2834 // |
2747 // It looks like we will have to live with the limited savings |
2835 // It looks like we will have to live with the limited savings |
2748 // that we get from effectively overwriting the old methods |
2836 // that we get from effectively overwriting the old methods |
2835 // more resilent to agents not cleaning up intermediate methods. |
2923 // more resilent to agents not cleaning up intermediate methods. |
2836 // Branch at each depth in the binary tree is: |
2924 // Branch at each depth in the binary tree is: |
2837 // (1) without the prefix. |
2925 // (1) without the prefix. |
2838 // (2) with the prefix. |
2926 // (2) with the prefix. |
2839 // where 'prefix' is the prefix at that 'depth' (first prefix, second prefix,...) |
2927 // where 'prefix' is the prefix at that 'depth' (first prefix, second prefix,...) |
2840 methodOop search_prefix_name_space(int depth, char* name_str, size_t name_len, |
2928 Method* search_prefix_name_space(int depth, char* name_str, size_t name_len, |
2841 Symbol* signature) { |
2929 Symbol* signature) { |
2842 TempNewSymbol name_symbol = SymbolTable::probe(name_str, (int)name_len); |
2930 TempNewSymbol name_symbol = SymbolTable::probe(name_str, (int)name_len); |
2843 if (name_symbol != NULL) { |
2931 if (name_symbol != NULL) { |
2844 methodOop method = Klass::cast(the_class())->lookup_method(name_symbol, signature); |
2932 Method* method = Klass::cast(the_class())->lookup_method(name_symbol, signature); |
2845 if (method != NULL) { |
2933 if (method != NULL) { |
2846 // Even if prefixed, intermediate methods must exist. |
2934 // Even if prefixed, intermediate methods must exist. |
2847 if (method->is_native()) { |
2935 if (method->is_native()) { |
2848 // Wahoo, we found a (possibly prefixed) version of the method, return it. |
2936 // Wahoo, we found a (possibly prefixed) version of the method, return it. |
2849 return method; |
2937 return method; |
2910 the_class = _the_class; |
2998 the_class = _the_class; |
2911 prefixes = JvmtiExport::get_all_native_method_prefixes(&prefix_count); |
2999 prefixes = JvmtiExport::get_all_native_method_prefixes(&prefix_count); |
2912 } |
3000 } |
2913 |
3001 |
2914 // Attempt to transfer any of the old or deleted methods that are native |
3002 // Attempt to transfer any of the old or deleted methods that are native |
2915 void transfer_registrations(methodOop* old_methods, int methods_length) { |
3003 void transfer_registrations(Method** old_methods, int methods_length) { |
2916 for (int j = 0; j < methods_length; j++) { |
3004 for (int j = 0; j < methods_length; j++) { |
2917 methodOop old_method = old_methods[j]; |
3005 Method* old_method = old_methods[j]; |
2918 |
3006 |
2919 if (old_method->is_native() && old_method->has_native_function()) { |
3007 if (old_method->is_native() && old_method->has_native_function()) { |
2920 methodOop new_method = strip_and_search_for_new_native(old_method); |
3008 Method* new_method = strip_and_search_for_new_native(old_method); |
2921 if (new_method != NULL) { |
3009 if (new_method != NULL) { |
2922 // Actually set the native function in the new method. |
3010 // Actually set the native function in the new method. |
2923 // Redefine does not send events (except CFLH), certainly not this |
3011 // Redefine does not send events (except CFLH), certainly not this |
2924 // behind the scenes re-registration. |
3012 // behind the scenes re-registration. |
2925 new_method->set_native_function(old_method->native_function(), |
3013 new_method->set_native_function(old_method->native_function(), |
2926 !methodOopDesc::native_bind_event_is_interesting); |
3014 !Method::native_bind_event_is_interesting); |
2927 } |
3015 } |
2928 } |
3016 } |
2929 } |
3017 } |
2930 } |
3018 } |
2931 }; |
3019 }; |
2975 JvmtiExport::set_all_dependencies_are_recorded(true); |
3063 JvmtiExport::set_all_dependencies_are_recorded(true); |
2976 } |
3064 } |
2977 } |
3065 } |
2978 |
3066 |
2979 void VM_RedefineClasses::compute_added_deleted_matching_methods() { |
3067 void VM_RedefineClasses::compute_added_deleted_matching_methods() { |
2980 methodOop old_method; |
3068 Method* old_method; |
2981 methodOop new_method; |
3069 Method* new_method; |
2982 |
3070 |
2983 _matching_old_methods = NEW_RESOURCE_ARRAY(methodOop, _old_methods->length()); |
3071 _matching_old_methods = NEW_RESOURCE_ARRAY(Method*, _old_methods->length()); |
2984 _matching_new_methods = NEW_RESOURCE_ARRAY(methodOop, _old_methods->length()); |
3072 _matching_new_methods = NEW_RESOURCE_ARRAY(Method*, _old_methods->length()); |
2985 _added_methods = NEW_RESOURCE_ARRAY(methodOop, _new_methods->length()); |
3073 _added_methods = NEW_RESOURCE_ARRAY(Method*, _new_methods->length()); |
2986 _deleted_methods = NEW_RESOURCE_ARRAY(methodOop, _old_methods->length()); |
3074 _deleted_methods = NEW_RESOURCE_ARRAY(Method*, _old_methods->length()); |
2987 |
3075 |
2988 _matching_methods_length = 0; |
3076 _matching_methods_length = 0; |
2989 _deleted_methods_length = 0; |
3077 _deleted_methods_length = 0; |
2990 _added_methods_length = 0; |
3078 _added_methods_length = 0; |
2991 |
3079 |
2995 if (oj >= _old_methods->length()) { |
3083 if (oj >= _old_methods->length()) { |
2996 if (nj >= _new_methods->length()) { |
3084 if (nj >= _new_methods->length()) { |
2997 break; // we've looked at everything, done |
3085 break; // we've looked at everything, done |
2998 } |
3086 } |
2999 // New method at the end |
3087 // New method at the end |
3000 new_method = (methodOop) _new_methods->obj_at(nj); |
3088 new_method = _new_methods->at(nj); |
3001 _added_methods[_added_methods_length++] = new_method; |
3089 _added_methods[_added_methods_length++] = new_method; |
3002 ++nj; |
3090 ++nj; |
3003 } else if (nj >= _new_methods->length()) { |
3091 } else if (nj >= _new_methods->length()) { |
3004 // Old method, at the end, is deleted |
3092 // Old method, at the end, is deleted |
3005 old_method = (methodOop) _old_methods->obj_at(oj); |
3093 old_method = _old_methods->at(oj); |
3006 _deleted_methods[_deleted_methods_length++] = old_method; |
3094 _deleted_methods[_deleted_methods_length++] = old_method; |
3007 ++oj; |
3095 ++oj; |
3008 } else { |
3096 } else { |
3009 old_method = (methodOop) _old_methods->obj_at(oj); |
3097 old_method = _old_methods->at(oj); |
3010 new_method = (methodOop) _new_methods->obj_at(nj); |
3098 new_method = _new_methods->at(nj); |
3011 if (old_method->name() == new_method->name()) { |
3099 if (old_method->name() == new_method->name()) { |
3012 if (old_method->signature() == new_method->signature()) { |
3100 if (old_method->signature() == new_method->signature()) { |
3013 _matching_old_methods[_matching_methods_length ] = old_method; |
3101 _matching_old_methods[_matching_methods_length ] = old_method; |
3014 _matching_new_methods[_matching_methods_length++] = new_method; |
3102 _matching_new_methods[_matching_methods_length++] = new_method; |
3015 ++nj; |
3103 ++nj; |
3050 // SystemDictionary::classes_do() facility which only allows |
3138 // SystemDictionary::classes_do() facility which only allows |
3051 // a helper method to be specified. The interesting parameters |
3139 // a helper method to be specified. The interesting parameters |
3052 // that we would like to pass to the helper method are saved in |
3140 // that we would like to pass to the helper method are saved in |
3053 // static global fields in the VM operation. |
3141 // static global fields in the VM operation. |
3054 void VM_RedefineClasses::redefine_single_class(jclass the_jclass, |
3142 void VM_RedefineClasses::redefine_single_class(jclass the_jclass, |
3055 instanceKlassHandle scratch_class, TRAPS) { |
3143 Klass* scratch_class_oop, TRAPS) { |
3056 |
3144 |
|
3145 HandleMark hm(THREAD); // make sure handles from this call are freed |
3057 RC_TIMER_START(_timer_rsc_phase1); |
3146 RC_TIMER_START(_timer_rsc_phase1); |
3058 |
3147 |
|
3148 instanceKlassHandle scratch_class(scratch_class_oop); |
|
3149 |
3059 oop the_class_mirror = JNIHandles::resolve_non_null(the_jclass); |
3150 oop the_class_mirror = JNIHandles::resolve_non_null(the_jclass); |
3060 klassOop the_class_oop = java_lang_Class::as_klassOop(the_class_mirror); |
3151 Klass* the_class_oop = java_lang_Class::as_Klass(the_class_mirror); |
3061 instanceKlassHandle the_class = instanceKlassHandle(THREAD, the_class_oop); |
3152 instanceKlassHandle the_class = instanceKlassHandle(THREAD, the_class_oop); |
3062 |
3153 |
3063 #ifndef JVMTI_KERNEL |
3154 #ifndef JVMTI_KERNEL |
3064 // Remove all breakpoints in methods of this class |
3155 // Remove all breakpoints in methods of this class |
3065 JvmtiBreakpoints& jvmti_breakpoints = JvmtiCurrentBreakpoints::get_jvmti_breakpoints(); |
3156 JvmtiBreakpoints& jvmti_breakpoints = JvmtiCurrentBreakpoints::get_jvmti_breakpoints(); |
3103 |
3194 |
3104 // Attach each old method to the new constant pool. This can be |
3195 // Attach each old method to the new constant pool. This can be |
3105 // done here since we are past the bytecode verification and |
3196 // done here since we are past the bytecode verification and |
3106 // constant pool optimization phases. |
3197 // constant pool optimization phases. |
3107 for (int i = _old_methods->length() - 1; i >= 0; i--) { |
3198 for (int i = _old_methods->length() - 1; i >= 0; i--) { |
3108 methodOop method = (methodOop)_old_methods->obj_at(i); |
3199 Method* method = _old_methods->at(i); |
3109 method->set_constants(scratch_class->constants()); |
3200 method->set_constants(scratch_class->constants()); |
3110 } |
3201 } |
3111 |
3202 |
3112 { |
3203 { |
3113 // walk all previous versions of the klass |
3204 // walk all previous versions of the klass |
3114 instanceKlass *ik = (instanceKlass *)the_class()->klass_part(); |
3205 InstanceKlass *ik = (InstanceKlass *)the_class(); |
3115 PreviousVersionWalker pvw(ik); |
3206 PreviousVersionWalker pvw(ik); |
3116 instanceKlassHandle ikh; |
3207 instanceKlassHandle ikh; |
3117 do { |
3208 do { |
3118 ikh = pvw.next_previous_version(); |
3209 ikh = pvw.next_previous_version(); |
3119 if (!ikh.is_null()) { |
3210 if (!ikh.is_null()) { |
3164 // check also works fine for methods inherited from super classes. |
3255 // check also works fine for methods inherited from super classes. |
3165 // |
3256 // |
3166 // Miranda methods are a little more complicated. A miranda method is |
3257 // Miranda methods are a little more complicated. A miranda method is |
3167 // provided by an interface when the class implementing the interface |
3258 // provided by an interface when the class implementing the interface |
3168 // does not provide its own method. These interfaces are implemented |
3259 // does not provide its own method. These interfaces are implemented |
3169 // internally as an instanceKlass. These special instanceKlasses |
3260 // internally as an InstanceKlass. These special instanceKlasses |
3170 // share the constant pool of the class that "implements" the |
3261 // share the constant pool of the class that "implements" the |
3171 // interface. By sharing the constant pool, the method holder of a |
3262 // interface. By sharing the constant pool, the method holder of a |
3172 // miranda method is the class that "implements" the interface. In a |
3263 // miranda method is the class that "implements" the interface. In a |
3173 // non-redefine situation, the subtype check works fine. However, if |
3264 // non-redefine situation, the subtype check works fine. However, if |
3174 // the old constant pool's pool holder is modified, then the check |
3265 // the old constant pool's pool holder is modified, then the check |
3245 flags.clear_has_localvariable_table(); |
3336 flags.clear_has_localvariable_table(); |
3246 } |
3337 } |
3247 the_class->set_access_flags(flags); |
3338 the_class->set_access_flags(flags); |
3248 } |
3339 } |
3249 |
3340 |
3250 // Replace class annotation fields values |
3341 // Replace annotation fields value |
3251 typeArrayOop old_class_annotations = the_class->class_annotations(); |
3342 Annotations* old_annotations = the_class->annotations(); |
3252 the_class->set_class_annotations(scratch_class->class_annotations()); |
3343 the_class->set_annotations(scratch_class->annotations()); |
3253 scratch_class->set_class_annotations(old_class_annotations); |
3344 scratch_class->set_annotations(old_annotations); |
3254 |
|
3255 // Replace fields annotation fields values |
|
3256 objArrayOop old_fields_annotations = the_class->fields_annotations(); |
|
3257 the_class->set_fields_annotations(scratch_class->fields_annotations()); |
|
3258 scratch_class->set_fields_annotations(old_fields_annotations); |
|
3259 |
|
3260 // Replace methods annotation fields values |
|
3261 objArrayOop old_methods_annotations = the_class->methods_annotations(); |
|
3262 the_class->set_methods_annotations(scratch_class->methods_annotations()); |
|
3263 scratch_class->set_methods_annotations(old_methods_annotations); |
|
3264 |
|
3265 // Replace methods parameter annotation fields values |
|
3266 objArrayOop old_methods_parameter_annotations = |
|
3267 the_class->methods_parameter_annotations(); |
|
3268 the_class->set_methods_parameter_annotations( |
|
3269 scratch_class->methods_parameter_annotations()); |
|
3270 scratch_class->set_methods_parameter_annotations(old_methods_parameter_annotations); |
|
3271 |
|
3272 // Replace methods default annotation fields values |
|
3273 objArrayOop old_methods_default_annotations = |
|
3274 the_class->methods_default_annotations(); |
|
3275 the_class->set_methods_default_annotations( |
|
3276 scratch_class->methods_default_annotations()); |
|
3277 scratch_class->set_methods_default_annotations(old_methods_default_annotations); |
|
3278 |
3345 |
3279 // Replace minor version number of class file |
3346 // Replace minor version number of class file |
3280 u2 old_minor_version = the_class->minor_version(); |
3347 u2 old_minor_version = the_class->minor_version(); |
3281 the_class->set_minor_version(scratch_class->minor_version()); |
3348 the_class->set_minor_version(scratch_class->minor_version()); |
3282 scratch_class->set_minor_version(old_minor_version); |
3349 scratch_class->set_minor_version(old_minor_version); |
3303 |
3370 |
3304 // Adjust constantpool caches and vtables for all classes |
3371 // Adjust constantpool caches and vtables for all classes |
3305 // that reference methods of the evolved class. |
3372 // that reference methods of the evolved class. |
3306 SystemDictionary::classes_do(adjust_cpool_cache_and_vtable, THREAD); |
3373 SystemDictionary::classes_do(adjust_cpool_cache_and_vtable, THREAD); |
3307 |
3374 |
|
3375 // Fix Resolution Error table also to remove old constant pools |
|
3376 SystemDictionary::delete_resolution_error(old_constants); |
|
3377 |
3308 if (the_class->oop_map_cache() != NULL) { |
3378 if (the_class->oop_map_cache() != NULL) { |
3309 // Flush references to any obsolete methods from the oop map cache |
3379 // Flush references to any obsolete methods from the oop map cache |
3310 // so that obsolete methods are not pinned. |
3380 // so that obsolete methods are not pinned. |
3311 the_class->oop_map_cache()->flush_obsolete_entries(); |
3381 the_class->oop_map_cache()->flush_obsolete_entries(); |
3312 } |
3382 } |
3313 |
3383 |
3314 // increment the classRedefinedCount field in the_class and in any |
3384 // increment the classRedefinedCount field in the_class and in any |
3315 // direct and indirect subclasses of the_class |
3385 // direct and indirect subclasses of the_class |
3316 increment_class_counter((instanceKlass *)the_class()->klass_part(), THREAD); |
3386 increment_class_counter((InstanceKlass *)the_class(), THREAD); |
3317 |
3387 |
3318 // RC_TRACE macro has an embedded ResourceMark |
3388 // RC_TRACE macro has an embedded ResourceMark |
3319 RC_TRACE_WITH_THREAD(0x00000001, THREAD, |
3389 RC_TRACE_WITH_THREAD(0x00000001, THREAD, |
3320 ("redefined name=%s, count=%d (avail_mem=" UINT64_FORMAT "K)", |
3390 ("redefined name=%s, count=%d (avail_mem=" UINT64_FORMAT "K)", |
3321 the_class->external_name(), |
3391 the_class->external_name(), |
3324 |
3394 |
3325 RC_TIMER_STOP(_timer_rsc_phase2); |
3395 RC_TIMER_STOP(_timer_rsc_phase2); |
3326 } // end redefine_single_class() |
3396 } // end redefine_single_class() |
3327 |
3397 |
3328 |
3398 |
3329 // Increment the classRedefinedCount field in the specific instanceKlass |
3399 // Increment the classRedefinedCount field in the specific InstanceKlass |
3330 // and in all direct and indirect subclasses. |
3400 // and in all direct and indirect subclasses. |
3331 void VM_RedefineClasses::increment_class_counter(instanceKlass *ik, TRAPS) { |
3401 void VM_RedefineClasses::increment_class_counter(InstanceKlass *ik, TRAPS) { |
3332 oop class_mirror = ik->java_mirror(); |
3402 oop class_mirror = ik->java_mirror(); |
3333 klassOop class_oop = java_lang_Class::as_klassOop(class_mirror); |
3403 Klass* class_oop = java_lang_Class::as_Klass(class_mirror); |
3334 int new_count = java_lang_Class::classRedefinedCount(class_mirror) + 1; |
3404 int new_count = java_lang_Class::classRedefinedCount(class_mirror) + 1; |
3335 java_lang_Class::set_classRedefinedCount(class_mirror, new_count); |
3405 java_lang_Class::set_classRedefinedCount(class_mirror, new_count); |
3336 |
3406 |
3337 if (class_oop != _the_class_oop) { |
3407 if (class_oop != _the_class_oop) { |
3338 // _the_class_oop count is printed at end of redefine_single_class() |
3408 // _the_class_oop count is printed at end of redefine_single_class() |
3342 |
3412 |
3343 for (Klass *subk = ik->subklass(); subk != NULL; |
3413 for (Klass *subk = ik->subklass(); subk != NULL; |
3344 subk = subk->next_sibling()) { |
3414 subk = subk->next_sibling()) { |
3345 if (subk->oop_is_instance()) { |
3415 if (subk->oop_is_instance()) { |
3346 // Only update instanceKlasses |
3416 // Only update instanceKlasses |
3347 instanceKlass *subik = (instanceKlass*)subk; |
3417 InstanceKlass *subik = (InstanceKlass*)subk; |
3348 // recursively do subclasses of the current subclass |
3418 // recursively do subclasses of the current subclass |
3349 increment_class_counter(subik, THREAD); |
3419 increment_class_counter(subik, THREAD); |
3350 } |
3420 } |
3351 } |
3421 } |
3352 } |
3422 } |
3353 |
3423 |
3354 #ifndef PRODUCT |
3424 #ifndef PRODUCT |
3355 void VM_RedefineClasses::check_class(klassOop k_oop, |
3425 void VM_RedefineClasses::check_class(Klass* k_oop, |
3356 oop initiating_loader, TRAPS) { |
3426 ClassLoaderData* initiating_loader, |
3357 Klass *k = k_oop->klass_part(); |
3427 TRAPS) { |
|
3428 Klass *k = k_oop; |
3358 if (k->oop_is_instance()) { |
3429 if (k->oop_is_instance()) { |
3359 HandleMark hm(THREAD); |
3430 HandleMark hm(THREAD); |
3360 instanceKlass *ik = (instanceKlass *) k; |
3431 InstanceKlass *ik = (InstanceKlass *) k; |
3361 |
3432 |
3362 if (ik->vtable_length() > 0) { |
3433 if (ik->vtable_length() > 0) { |
3363 ResourceMark rm(THREAD); |
3434 ResourceMark rm(THREAD); |
3364 if (!ik->vtable()->check_no_old_entries()) { |
3435 if (!ik->vtable()->check_no_old_entries()) { |
3365 tty->print_cr("klassVtable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name()); |
3436 tty->print_cr("klassVtable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name()); |
3366 ik->vtable()->dump_vtable(); |
3437 ik->vtable()->dump_vtable(); |
3367 dump_methods(); |
|
3368 assert(false, "OLD method found"); |
3438 assert(false, "OLD method found"); |
3369 } |
3439 } |
|
3440 } |
|
3441 if (ik->itable_length() > 0) { |
|
3442 ResourceMark rm(THREAD); |
|
3443 if (!ik->itable()->check_no_old_entries()) { |
|
3444 tty->print_cr("klassItable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name()); |
|
3445 assert(false, "OLD method found"); |
|
3446 } |
|
3447 } |
|
3448 // Check that the constant pool cache has no deleted entries. |
|
3449 if (ik->constants() != NULL && |
|
3450 ik->constants()->cache() != NULL && |
|
3451 !ik->constants()->cache()->check_no_old_entries()) { |
|
3452 tty->print_cr("klassVtable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name()); |
|
3453 assert(false, "OLD method found"); |
3370 } |
3454 } |
3371 } |
3455 } |
3372 } |
3456 } |
3373 |
3457 |
3374 void VM_RedefineClasses::dump_methods() { |
3458 void VM_RedefineClasses::dump_methods() { |
3375 int j; |
3459 int j; |
3376 tty->print_cr("_old_methods --"); |
3460 tty->print_cr("_old_methods --"); |
3377 for (j = 0; j < _old_methods->length(); ++j) { |
3461 for (j = 0; j < _old_methods->length(); ++j) { |
3378 methodOop m = (methodOop) _old_methods->obj_at(j); |
3462 Method* m = _old_methods->at(j); |
3379 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3463 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3380 m->access_flags().print_on(tty); |
3464 m->access_flags().print_on(tty); |
3381 tty->print(" -- "); |
3465 tty->print(" -- "); |
3382 m->print_name(tty); |
3466 m->print_name(tty); |
3383 tty->cr(); |
3467 tty->cr(); |
3384 } |
3468 } |
3385 tty->print_cr("_new_methods --"); |
3469 tty->print_cr("_new_methods --"); |
3386 for (j = 0; j < _new_methods->length(); ++j) { |
3470 for (j = 0; j < _new_methods->length(); ++j) { |
3387 methodOop m = (methodOop) _new_methods->obj_at(j); |
3471 Method* m = _new_methods->at(j); |
3388 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3472 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3389 m->access_flags().print_on(tty); |
3473 m->access_flags().print_on(tty); |
3390 tty->print(" -- "); |
3474 tty->print(" -- "); |
3391 m->print_name(tty); |
3475 m->print_name(tty); |
3392 tty->cr(); |
3476 tty->cr(); |
3393 } |
3477 } |
3394 tty->print_cr("_matching_(old/new)_methods --"); |
3478 tty->print_cr("_matching_(old/new)_methods --"); |
3395 for (j = 0; j < _matching_methods_length; ++j) { |
3479 for (j = 0; j < _matching_methods_length; ++j) { |
3396 methodOop m = _matching_old_methods[j]; |
3480 Method* m = _matching_old_methods[j]; |
3397 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3481 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3398 m->access_flags().print_on(tty); |
3482 m->access_flags().print_on(tty); |
3399 tty->print(" -- "); |
3483 tty->print(" -- "); |
3400 m->print_name(tty); |
3484 m->print_name(tty); |
3401 tty->cr(); |
3485 tty->cr(); |
3404 m->access_flags().print_on(tty); |
3488 m->access_flags().print_on(tty); |
3405 tty->cr(); |
3489 tty->cr(); |
3406 } |
3490 } |
3407 tty->print_cr("_deleted_methods --"); |
3491 tty->print_cr("_deleted_methods --"); |
3408 for (j = 0; j < _deleted_methods_length; ++j) { |
3492 for (j = 0; j < _deleted_methods_length; ++j) { |
3409 methodOop m = _deleted_methods[j]; |
3493 Method* m = _deleted_methods[j]; |
3410 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3494 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3411 m->access_flags().print_on(tty); |
3495 m->access_flags().print_on(tty); |
3412 tty->print(" -- "); |
3496 tty->print(" -- "); |
3413 m->print_name(tty); |
3497 m->print_name(tty); |
3414 tty->cr(); |
3498 tty->cr(); |
3415 } |
3499 } |
3416 tty->print_cr("_added_methods --"); |
3500 tty->print_cr("_added_methods --"); |
3417 for (j = 0; j < _added_methods_length; ++j) { |
3501 for (j = 0; j < _added_methods_length; ++j) { |
3418 methodOop m = _added_methods[j]; |
3502 Method* m = _added_methods[j]; |
3419 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3503 tty->print("%4d (%5d) ", j, m->vtable_index()); |
3420 m->access_flags().print_on(tty); |
3504 m->access_flags().print_on(tty); |
3421 tty->print(" -- "); |
3505 tty->print(" -- "); |
3422 m->print_name(tty); |
3506 m->print_name(tty); |
3423 tty->cr(); |
3507 tty->cr(); |