46 }
47 _regenerated_mirrors->append(OopHandle(Universe::vm_global(), regen_klass->java_mirror()));
48
49 if (_renegerated_objs == nullptr) {
50 _renegerated_objs = new (mtClass)RegeneratedObjTable();
51 }
52
53 _renegerated_objs->put((address)orig_klass, (address)regen_klass);
54 Array<Method*>* methods = orig_klass->methods();
55 for (int i = 0; i < methods->length(); i++) {
56 Method* orig_m = methods->at(i);
57 Method* regen_m = regen_klass->find_method(orig_m->name(), orig_m->signature());
58 if (regen_m == nullptr) {
59 ResourceMark rm;
60 log_warning(cds)("Method in original class is missing from regenerated class: " INTPTR_FORMAT " %s",
61 p2i(orig_m), orig_m->external_name());
62 } else {
63 _renegerated_objs->put((address)orig_m, (address)regen_m);
64 }
65 }
66 }
67
68 bool RegeneratedClasses::has_been_regenerated(address orig_obj) {
69 if (_renegerated_objs == nullptr) {
70 return false;
71 } else {
72 return _renegerated_objs->get(orig_obj) != nullptr;
73 }
74 }
75
76 void RegeneratedClasses::record_regenerated_objects() {
77 assert_locked_or_safepoint(DumpTimeTable_lock);
78 if (_renegerated_objs != nullptr) {
79 auto doit = [&] (address orig_obj, address regen_obj) {
80 ArchiveBuilder::current()->record_regenerated_object(orig_obj, regen_obj);
81 };
82 _renegerated_objs->iterate_all(doit);
83 }
84 }
85
86 void RegeneratedClasses::cleanup() {
87 MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag);
88 if (_regenerated_mirrors != nullptr) {
89 for (int i = 0; i < _regenerated_mirrors->length(); i++) {
90 _regenerated_mirrors->at(i).release(Universe::vm_global());
91 }
92 delete _regenerated_mirrors;
93 _regenerated_mirrors = nullptr;
94 }
95 if (_renegerated_objs != nullptr) {
|
46 }
47 _regenerated_mirrors->append(OopHandle(Universe::vm_global(), regen_klass->java_mirror()));
48
49 if (_renegerated_objs == nullptr) {
50 _renegerated_objs = new (mtClass)RegeneratedObjTable();
51 }
52
53 _renegerated_objs->put((address)orig_klass, (address)regen_klass);
54 Array<Method*>* methods = orig_klass->methods();
55 for (int i = 0; i < methods->length(); i++) {
56 Method* orig_m = methods->at(i);
57 Method* regen_m = regen_klass->find_method(orig_m->name(), orig_m->signature());
58 if (regen_m == nullptr) {
59 ResourceMark rm;
60 log_warning(cds)("Method in original class is missing from regenerated class: " INTPTR_FORMAT " %s",
61 p2i(orig_m), orig_m->external_name());
62 } else {
63 _renegerated_objs->put((address)orig_m, (address)regen_m);
64 }
65 }
66
67 if (log_is_enabled(Info, cds)) {
68 ResourceMark rm;
69 log_info(cds)("Regenerated class %s: methods %d -> %d)", orig_klass->external_name(),
70 orig_klass->methods()->length(), regen_klass->methods()->length());
71 }
72 }
73
74 bool RegeneratedClasses::has_been_regenerated(address orig_obj) {
75 if (_renegerated_objs == nullptr) {
76 return false;
77 } else {
78 return _renegerated_objs->get(orig_obj) != nullptr;
79 }
80 }
81
82 address RegeneratedClasses::get_regenerated_object(address orig_obj) {
83 assert(_renegerated_objs != nullptr, "must be");
84 address* p =_renegerated_objs->get(orig_obj);
85 assert(p != nullptr, "must be");
86 return *p;
87 }
88
89 void RegeneratedClasses::record_regenerated_objects() {
90 assert_locked_or_safepoint(DumpTimeTable_lock);
91 if (_renegerated_objs != nullptr) {
92 auto doit = [&] (address orig_obj, address regen_obj) {
93 ArchiveBuilder::current()->record_regenerated_object(orig_obj, regen_obj);
94 };
95 _renegerated_objs->iterate_all(doit);
96 }
97 }
98
99 void RegeneratedClasses::cleanup() {
100 MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag);
101 if (_regenerated_mirrors != nullptr) {
102 for (int i = 0; i < _regenerated_mirrors->length(); i++) {
103 _regenerated_mirrors->at(i).release(Universe::vm_global());
104 }
105 delete _regenerated_mirrors;
106 _regenerated_mirrors = nullptr;
107 }
108 if (_renegerated_objs != nullptr) {
|