< prev index next >
src/hotspot/share/classfile/javaClasses.cpp
Print this page
*** 1213,1232 ****
archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr);
}
return archived_mirror;
}
void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {
Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
- if (k != NULL) { // k is NULL for the primitive classes such as java.lang.Byte::TYPE
archived_mirror->metadata_field_put(_klass_offset, (Klass*)(address(k) + MetaspaceShared::mapping_delta()));
- }
Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
if (ak != NULL) {
archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(ak) + MetaspaceShared::mapping_delta()));
}
}
// Returns true if the mirror is updated, false if no archived mirror
// data is present. After the archived mirror object is restored, the
--- 1213,1243 ----
archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr);
}
return archived_mirror;
}
+ void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archived_mirror) {
+ if (MetaspaceShared::mapping_delta() != 0) {
+ assert(archived_mirror->metadata_field(_klass_offset) == NULL, "must be for primitive class");
+
+ Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
+ if (ak != NULL) {
+ archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(ak) + MetaspaceShared::mapping_delta()));
+ }
+ }
+ }
+
void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {
+ if (MetaspaceShared::mapping_delta() != 0) {
Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
archived_mirror->metadata_field_put(_klass_offset, (Klass*)(address(k) + MetaspaceShared::mapping_delta()));
Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
if (ak != NULL) {
archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(ak) + MetaspaceShared::mapping_delta()));
}
+ }
}
// Returns true if the mirror is updated, false if no archived mirror
// data is present. After the archived mirror object is restored, the
*** 1241,1260 ****
fixup_mirror_list()->push(k);
return true;
}
oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());
-
if (m == NULL) {
return false;
}
- log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
- update_archived_mirror_native_pointers(m);
-
// mirror is archived, restore
assert(HeapShared::is_archived_object(m), "must be archived mirror object");
Handle mirror(THREAD, m);
if (!k->is_array_klass()) {
// - local static final fields with initial values were initialized at dump time
--- 1252,1270 ----
fixup_mirror_list()->push(k);
return true;
}
oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());
if (m == NULL) {
return false;
}
// mirror is archived, restore
+ log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
assert(HeapShared::is_archived_object(m), "must be archived mirror object");
+ update_archived_mirror_native_pointers(m);
+ assert(as_Klass(m) == k, "must be");
Handle mirror(THREAD, m);
if (!k->is_array_klass()) {
// - local static final fields with initial values were initialized at dump time
< prev index next >