< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page

@@ -1213,20 +1213,31 @@
     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));
-  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

@@ -1241,20 +1252,19 @@
     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
+  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 >