< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page


1238       "Relocate mirror metadata field at _array_klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT,
1239       p2i(arr), p2i(reloc_arr));
1240     archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr);
1241   }
1242   return archived_mirror;
1243 }
1244 
1245 void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archived_mirror) {
1246   if (MetaspaceShared::relocation_delta() != 0) {
1247     assert(archived_mirror->metadata_field(_klass_offset) == NULL, "must be for primitive class");
1248 
1249     Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1250     if (ak != NULL) {
1251       archived_mirror->metadata_field_put(_array_klass_offset,
1252           (Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
1253     }
1254   }
1255 }
1256 
1257 void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {
1258   if (MetaspaceShared::relocation_delta() != 0) {

1259     Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
1260     archived_mirror->metadata_field_put(_klass_offset,
1261         (Klass*)(address(k) + MetaspaceShared::relocation_delta()));
1262 
1263     Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1264     if (ak != NULL) {
1265       archived_mirror->metadata_field_put(_array_klass_offset,
1266           (Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
1267     }
1268   }
1269 }
1270 
1271 
1272 // Returns true if the mirror is updated, false if no archived mirror
1273 // data is present. After the archived mirror object is restored, the
1274 // shared klass' _has_raw_archived_mirror flag is cleared.
1275 bool java_lang_Class::restore_archived_mirror(Klass *k,
1276                                               Handle class_loader, Handle module,
1277                                               Handle protection_domain, TRAPS) {
1278   // Postpone restoring archived mirror until java.lang.Class is loaded. Please
1279   // see more details in SystemDictionary::resolve_well_known_classes().
1280   if (!SystemDictionary::Class_klass_loaded()) {
1281     assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");
1282     fixup_mirror_list()->push(k);
1283     return true;
1284   }
1285 
1286   oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());
1287   if (m == NULL) {
1288     return false;
1289   }
1290 
1291   // mirror is archived, restore
1292   log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
1293   assert(HeapShared::is_archived_object(m), "must be archived mirror object");
1294   update_archived_mirror_native_pointers(m);
1295   assert(as_Klass(m) == k, "must be");
1296   Handle mirror(THREAD, m);
1297 
1298   if (!k->is_array_klass()) {
1299     // - local static final fields with initial values were initialized at dump time
1300 
1301     // create the init_lock
1302     typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false));
1303     set_init_lock(mirror(), r);
1304 
1305     if (protection_domain.not_null()) {
1306       set_protection_domain(mirror(), protection_domain());
1307     }
1308   }
1309 
1310   assert(class_loader() == k->class_loader(), "should be same");
1311   if (class_loader.not_null()) {
1312     set_class_loader(mirror(), class_loader());
1313   }
1314 




1238       "Relocate mirror metadata field at _array_klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT,
1239       p2i(arr), p2i(reloc_arr));
1240     archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr);
1241   }
1242   return archived_mirror;
1243 }
1244 
1245 void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archived_mirror) {
1246   if (MetaspaceShared::relocation_delta() != 0) {
1247     assert(archived_mirror->metadata_field(_klass_offset) == NULL, "must be for primitive class");
1248 
1249     Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1250     if (ak != NULL) {
1251       archived_mirror->metadata_field_put(_array_klass_offset,
1252           (Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
1253     }
1254   }
1255 }
1256 
1257 void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {
1258   assert(MetaspaceShared::relocation_delta() != 0, "must be");
1259 
1260   Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
1261   archived_mirror->metadata_field_put(_klass_offset,
1262       (Klass*)(address(k) + MetaspaceShared::relocation_delta()));
1263 
1264   Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1265   if (ak != NULL) {
1266     archived_mirror->metadata_field_put(_array_klass_offset,
1267         (Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
1268   }

1269 }
1270 
1271 
1272 // Returns true if the mirror is updated, false if no archived mirror
1273 // data is present. After the archived mirror object is restored, the
1274 // shared klass' _has_raw_archived_mirror flag is cleared.
1275 bool java_lang_Class::restore_archived_mirror(Klass *k,
1276                                               Handle class_loader, Handle module,
1277                                               Handle protection_domain, TRAPS) {
1278   // Postpone restoring archived mirror until java.lang.Class is loaded. Please
1279   // see more details in SystemDictionary::resolve_well_known_classes().
1280   if (!SystemDictionary::Class_klass_loaded()) {
1281     assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");
1282     fixup_mirror_list()->push(k);
1283     return true;
1284   }
1285 
1286   oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());
1287   if (m == NULL) {
1288     return false;
1289   }
1290 
1291   // mirror is archived, restore
1292   log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
1293   assert(HeapShared::is_archived_object(m), "must be archived mirror object");

1294   assert(as_Klass(m) == k, "must be");
1295   Handle mirror(THREAD, m);
1296 
1297   if (!k->is_array_klass()) {
1298     // - local static final fields with initial values were initialized at dump time
1299 
1300     // create the init_lock
1301     typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false));
1302     set_init_lock(mirror(), r);
1303 
1304     if (protection_domain.not_null()) {
1305       set_protection_domain(mirror(), protection_domain());
1306     }
1307   }
1308 
1309   assert(class_loader() == k->class_loader(), "should be same");
1310   if (class_loader.not_null()) {
1311     set_class_loader(mirror(), class_loader());
1312   }
1313 


< prev index next >