diff --git a/src/hotspot/share/oops/klass.cpp b/src/hotspot/share/oops/klass.cpp index 82c5723..c5aad77 100644 --- a/src/hotspot/share/oops/klass.cpp +++ b/src/hotspot/share/oops/klass.cpp @@ -35,6 +35,7 @@ #include "memory/metaspaceShared.hpp" #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" +#include "oops/access.inline.hpp" #include "oops/instanceKlass.hpp" #include "oops/klass.inline.hpp" #include "oops/oop.inline.hpp" @@ -54,6 +55,18 @@ oop Klass::java_mirror() const { return _java_mirror.resolve(); } +oop Klass::java_mirror_phantom() { + // Loading the klass_holder as a phantom oop ref keeps the class alive. + // After the holder has been kept alive, it is safe to return the mirror. + (void)klass_holder_phantom(); + return java_mirror(); +} + +oop Klass::klass_holder_phantom() { + oop* addr = &class_loader_data()->_class_loader; + return RootAccess::oop_load(addr); +} + bool Klass::is_cloneable() const { return _access_flags.is_cloneable_fast() || is_subtype_of(SystemDictionary::Cloneable_klass());