JBR-8636 DCEVM - eagerly set new_version in MagicAccessorImpl

This commit is contained in:
Vladimir Dvorak
2025-06-03 22:05:27 +02:00
parent b06068de9c
commit 8cfd55e764

View File

@@ -563,7 +563,10 @@ void VM_EnhancedRedefineClasses::doit() {
for (int i = 0; i < _new_classes->length(); i++) {
Klass *new_class = _new_classes->at(i);
new_class->old_version()->set_new_version(new_class);
// MagicAccessorImpl new_class is set in load_new_class_versions
if (new_class->old_version() != vmClasses::reflect_MagicAccessorImpl_klass() || new_class->old_version()->new_version() == nullptr) {
new_class->old_version()->set_new_version(new_class);
}
}
for (int i = 0; i < _new_classes->length(); i++) {
@@ -1101,6 +1104,14 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions_single_step(Old2N
old_2_new_klass_map->put(the_class, new_class);
_new_classes->append(new_class);
// If MagicAccessorImpl is being redefined, we must set new_version,
// because class loading may trigger Reflection::verify_class_access,
// which performs superclass checks. This can occur when a subclass
// of MagicAccessorImpl is being loaded as part of the same redefinition run.
if (the_class == vmClasses::reflect_MagicAccessorImpl_klass()) {
the_class->set_new_version(new_class);
}
if (the_class == vmClasses::Reference_klass()) {
// must set offset+count to skip field "referent". Look at InstanceRefKlass::update_nonstatic_oop_maps
OopMapBlock* old_map = the_class->start_of_nonstatic_oop_maps();