< prev index next > src/hotspot/share/oops/klass.cpp
Print this page
// The constructor is also used from CppVtableCloner,
// which doesn't zero out the memory before calling the constructor.
Klass::Klass(KlassID id) : _id(id),
_prototype_header(markWord::prototype()),
_shared_class_path_index(-1) {
! CDS_ONLY(_shared_class_flags = 0;)
! CDS_JAVA_HEAP_ONLY(_archived_mirror = narrowOop::null;)
_primary_supers[0] = this;
set_super_check_offset(in_bytes(primary_supers_offset()));
}
jint Klass::array_layout_helper(BasicType etype) {
// The constructor is also used from CppVtableCloner,
// which doesn't zero out the memory before calling the constructor.
Klass::Klass(KlassID id) : _id(id),
_prototype_header(markWord::prototype()),
_shared_class_path_index(-1) {
! CDS_ONLY(_shared_class_flags = 0);
! CDS_JAVA_HEAP_ONLY(_archived_mirror_index = -1);
_primary_supers[0] = this;
set_super_check_offset(in_bytes(primary_supers_offset()));
}
jint Klass::array_layout_helper(BasicType etype) {
// If an exception happened during CDS restore, some of these fields may already be
// set. We leave the class on the CLD list, even if incomplete so that we don't
// modify the CLD list outside a safepoint.
if (class_loader_data() == NULL) {
- // Restore class_loader_data to the null class loader data
set_class_loader_data(loader_data);
! // Add to null class loader list first before creating the mirror
// (same order as class file parsing)
loader_data->add_class(this);
}
Handle loader(THREAD, loader_data->class_loader());
// If an exception happened during CDS restore, some of these fields may already be
// set. We leave the class on the CLD list, even if incomplete so that we don't
// modify the CLD list outside a safepoint.
if (class_loader_data() == NULL) {
set_class_loader_data(loader_data);
! // Add to class loader list first before creating the mirror
// (same order as class file parsing)
loader_data->add_class(this);
}
Handle loader(THREAD, loader_data->class_loader());
module_entry = ModuleEntryTable::javabase_moduleEntry();
}
// Obtain java.lang.Module, if available
Handle module_handle(THREAD, ((module_entry != NULL) ? module_entry->module() : (oop)NULL));
! if (this->has_raw_archived_mirror()) {
ResourceMark rm(THREAD);
log_debug(cds, mirror)("%s has raw archived mirror", external_name());
if (HeapShared::open_archive_heap_region_mapped()) {
bool present = java_lang_Class::restore_archived_mirror(this, loader, module_handle,
protection_domain,
module_entry = ModuleEntryTable::javabase_moduleEntry();
}
// Obtain java.lang.Module, if available
Handle module_handle(THREAD, ((module_entry != NULL) ? module_entry->module() : (oop)NULL));
! if (this->has_archived_mirror_index()) {
ResourceMark rm(THREAD);
log_debug(cds, mirror)("%s has raw archived mirror", external_name());
if (HeapShared::open_archive_heap_region_mapped()) {
bool present = java_lang_Class::restore_archived_mirror(this, loader, module_handle,
protection_domain,
}
// No archived mirror data
log_debug(cds, mirror)("No archived mirror data for %s", external_name());
clear_java_mirror_handle();
! this->clear_has_raw_archived_mirror();
}
// Only recreate it if not present. A previous attempt to restore may have
// gotten an OOM later but keep the mirror if it was created.
if (java_mirror() == NULL) {
}
// No archived mirror data
log_debug(cds, mirror)("No archived mirror data for %s", external_name());
clear_java_mirror_handle();
! this->clear_archived_mirror_index();
}
// Only recreate it if not present. A previous attempt to restore may have
// gotten an OOM later but keep the mirror if it was created.
if (java_mirror() == NULL) {
java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, Handle(), CHECK);
}
}
#if INCLUDE_CDS_JAVA_HEAP
! // Used at CDS dump time to access the archived mirror. No GC barrier.
! oop Klass::archived_java_mirror_raw() {
! assert(has_raw_archived_mirror(), "must have raw archived mirror");
- return CompressedOops::decode(_archived_mirror);
}
! narrowOop Klass::archived_java_mirror_raw_narrow() {
! assert(has_raw_archived_mirror(), "must have raw archived mirror");
! return _archived_mirror;
}
// No GC barrier
! void Klass::set_archived_java_mirror_raw(oop m) {
assert(DumpSharedSpaces, "called only during runtime");
! _archived_mirror = CompressedOops::encode(m);
}
#endif // INCLUDE_CDS_JAVA_HEAP
Klass* Klass::array_klass_or_null(int rank) {
EXCEPTION_MARK;
java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, Handle(), CHECK);
}
}
#if INCLUDE_CDS_JAVA_HEAP
! oop Klass::archived_java_mirror() {
! assert(has_archived_mirror_index(), "must have archived mirror");
! return HeapShared::get_root(_archived_mirror_index);
}
! void Klass::clear_archived_mirror_index() {
! if (_archived_mirror_index >= 0) {
! HeapShared::clear_root(_archived_mirror_index);
+ }
+ _archived_mirror_index = -1;
}
// No GC barrier
! void Klass::set_archived_java_mirror(oop m) {
assert(DumpSharedSpaces, "called only during runtime");
! _archived_mirror_index = HeapShared::append_root(m);
}
#endif // INCLUDE_CDS_JAVA_HEAP
Klass* Klass::array_klass_or_null(int rank) {
EXCEPTION_MARK;
< prev index next >