--- old/src/hotspot/share/classfile/javaClasses.cpp 2019-10-16 19:29:40.684297727 -0700 +++ new/src/hotspot/share/classfile/javaClasses.cpp 2019-10-16 19:29:40.428288452 -0700 @@ -1215,15 +1215,26 @@ 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) { - 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 + 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())); + 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())); + } } } @@ -1243,16 +1254,15 @@ } 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 + 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()) {