83 #include "utilities/hashtable.inline.hpp" |
83 #include "utilities/hashtable.inline.hpp" |
84 #include "utilities/macros.hpp" |
84 #include "utilities/macros.hpp" |
85 #include "utilities/ostream.hpp" |
85 #include "utilities/ostream.hpp" |
86 #include "utilities/preserveException.hpp" |
86 #include "utilities/preserveException.hpp" |
87 |
87 |
|
88 #define PRIMITIVE_MIRRORS_DO(func) \ |
|
89 func(_int_mirror) \ |
|
90 func(_float_mirror) \ |
|
91 func(_double_mirror) \ |
|
92 func(_byte_mirror) \ |
|
93 func(_bool_mirror) \ |
|
94 func(_char_mirror) \ |
|
95 func(_long_mirror) \ |
|
96 func(_short_mirror) \ |
|
97 func(_void_mirror) |
|
98 |
|
99 #define DEFINE_PRIMITIVE_MIRROR(m) \ |
|
100 oop Universe::m = NULL; |
|
101 |
88 // Known objects |
102 // Known objects |
|
103 PRIMITIVE_MIRRORS_DO(DEFINE_PRIMITIVE_MIRROR) |
89 Klass* Universe::_typeArrayKlassObjs[T_LONG+1] = { NULL /*, NULL...*/ }; |
104 Klass* Universe::_typeArrayKlassObjs[T_LONG+1] = { NULL /*, NULL...*/ }; |
90 Klass* Universe::_objectArrayKlassObj = NULL; |
105 Klass* Universe::_objectArrayKlassObj = NULL; |
91 oop Universe::_int_mirror = NULL; |
|
92 oop Universe::_float_mirror = NULL; |
|
93 oop Universe::_double_mirror = NULL; |
|
94 oop Universe::_byte_mirror = NULL; |
|
95 oop Universe::_bool_mirror = NULL; |
|
96 oop Universe::_char_mirror = NULL; |
|
97 oop Universe::_long_mirror = NULL; |
|
98 oop Universe::_short_mirror = NULL; |
|
99 oop Universe::_void_mirror = NULL; |
|
100 oop Universe::_mirrors[T_VOID+1] = { NULL /*, NULL...*/ }; |
106 oop Universe::_mirrors[T_VOID+1] = { NULL /*, NULL...*/ }; |
101 oop Universe::_main_thread_group = NULL; |
107 oop Universe::_main_thread_group = NULL; |
102 oop Universe::_system_thread_group = NULL; |
108 oop Universe::_system_thread_group = NULL; |
103 objArrayOop Universe::_the_empty_class_klass_array = NULL; |
109 objArrayOop Universe::_the_empty_class_klass_array = NULL; |
104 Array<Klass*>* Universe::_the_array_interfaces_array = NULL; |
110 Array<Klass*>* Universe::_the_array_interfaces_array = NULL; |
165 for (int i = T_BOOLEAN; i < T_LONG+1; i++) { |
171 for (int i = T_BOOLEAN; i < T_LONG+1; i++) { |
166 closure->do_klass(_typeArrayKlassObjs[i]); |
172 closure->do_klass(_typeArrayKlassObjs[i]); |
167 } |
173 } |
168 } |
174 } |
169 |
175 |
|
176 #define DO_PRIMITIVE_MIRROR(m) \ |
|
177 f->do_oop((oop*) &m); |
|
178 |
170 void Universe::oops_do(OopClosure* f) { |
179 void Universe::oops_do(OopClosure* f) { |
171 |
180 PRIMITIVE_MIRRORS_DO(DO_PRIMITIVE_MIRROR); |
172 f->do_oop((oop*) &_int_mirror); |
|
173 f->do_oop((oop*) &_float_mirror); |
|
174 f->do_oop((oop*) &_double_mirror); |
|
175 f->do_oop((oop*) &_byte_mirror); |
|
176 f->do_oop((oop*) &_bool_mirror); |
|
177 f->do_oop((oop*) &_char_mirror); |
|
178 f->do_oop((oop*) &_long_mirror); |
|
179 f->do_oop((oop*) &_short_mirror); |
|
180 f->do_oop((oop*) &_void_mirror); |
|
181 |
181 |
182 for (int i = T_BOOLEAN; i < T_VOID+1; i++) { |
182 for (int i = T_BOOLEAN; i < T_VOID+1; i++) { |
183 f->do_oop((oop*) &_mirrors[i]); |
183 f->do_oop((oop*) &_mirrors[i]); |
184 } |
184 } |
185 assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking"); |
185 assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking"); |
229 _throw_illegal_access_error_cache->metaspace_pointers_do(it); |
229 _throw_illegal_access_error_cache->metaspace_pointers_do(it); |
230 _throw_no_such_method_error_cache->metaspace_pointers_do(it); |
230 _throw_no_such_method_error_cache->metaspace_pointers_do(it); |
231 _do_stack_walk_cache->metaspace_pointers_do(it); |
231 _do_stack_walk_cache->metaspace_pointers_do(it); |
232 } |
232 } |
233 |
233 |
|
234 #define ASSERT_MIRROR_NULL(m) \ |
|
235 assert(m == NULL, "archived mirrors should be NULL"); |
|
236 |
|
237 #define SERIALIZE_MIRROR(m) \ |
|
238 f->do_oop(&m); \ |
|
239 if (m != NULL) { java_lang_Class::update_archived_primitive_mirror_native_pointers(m); } |
|
240 |
234 // Serialize metadata and pointers to primitive type mirrors in and out of CDS archive |
241 // Serialize metadata and pointers to primitive type mirrors in and out of CDS archive |
235 void Universe::serialize(SerializeClosure* f) { |
242 void Universe::serialize(SerializeClosure* f) { |
236 |
243 |
237 for (int i = 0; i < T_LONG+1; i++) { |
244 for (int i = 0; i < T_LONG+1; i++) { |
238 f->do_ptr((void**)&_typeArrayKlassObjs[i]); |
245 f->do_ptr((void**)&_typeArrayKlassObjs[i]); |
239 } |
246 } |
240 |
247 |
241 f->do_ptr((void**)&_objectArrayKlassObj); |
248 f->do_ptr((void**)&_objectArrayKlassObj); |
|
249 |
242 #if INCLUDE_CDS_JAVA_HEAP |
250 #if INCLUDE_CDS_JAVA_HEAP |
243 #ifdef ASSERT |
251 DEBUG_ONLY(if (DumpSharedSpaces && !HeapShared::is_heap_object_archiving_allowed()) { |
244 if (DumpSharedSpaces && !HeapShared::is_heap_object_archiving_allowed()) { |
252 PRIMITIVE_MIRRORS_DO(ASSERT_MIRROR_NULL); |
245 assert(_int_mirror == NULL && _float_mirror == NULL && |
253 }); |
246 _double_mirror == NULL && _byte_mirror == NULL && |
254 PRIMITIVE_MIRRORS_DO(SERIALIZE_MIRROR); |
247 _bool_mirror == NULL && _char_mirror == NULL && |
|
248 _long_mirror == NULL && _short_mirror == NULL && |
|
249 _void_mirror == NULL, "mirrors should be NULL"); |
|
250 } |
|
251 #endif |
|
252 f->do_oop(&_int_mirror); |
|
253 f->do_oop(&_float_mirror); |
|
254 f->do_oop(&_double_mirror); |
|
255 f->do_oop(&_byte_mirror); |
|
256 f->do_oop(&_bool_mirror); |
|
257 f->do_oop(&_char_mirror); |
|
258 f->do_oop(&_long_mirror); |
|
259 f->do_oop(&_short_mirror); |
|
260 f->do_oop(&_void_mirror); |
|
261 #endif |
255 #endif |
262 |
256 |
263 f->do_ptr((void**)&_the_array_interfaces_array); |
257 f->do_ptr((void**)&_the_array_interfaces_array); |
264 f->do_ptr((void**)&_the_empty_int_array); |
258 f->do_ptr((void**)&_the_empty_int_array); |
265 f->do_ptr((void**)&_the_empty_short_array); |
259 f->do_ptr((void**)&_the_empty_short_array); |
417 assert(i == _fullgc_alot_dummy_array->length(), "just checking"); |
411 assert(i == _fullgc_alot_dummy_array->length(), "just checking"); |
418 } |
412 } |
419 #endif |
413 #endif |
420 } |
414 } |
421 |
415 |
|
416 #define ASSERT_MIRROR_NOT_NULL(m) \ |
|
417 assert(m != NULL, "archived mirrors should not be NULL"); |
|
418 |
422 void Universe::initialize_basic_type_mirrors(TRAPS) { |
419 void Universe::initialize_basic_type_mirrors(TRAPS) { |
423 #if INCLUDE_CDS_JAVA_HEAP |
420 #if INCLUDE_CDS_JAVA_HEAP |
424 if (UseSharedSpaces && |
421 if (UseSharedSpaces && |
425 HeapShared::open_archive_heap_region_mapped() && |
422 HeapShared::open_archive_heap_region_mapped() && |
426 _int_mirror != NULL) { |
423 _int_mirror != NULL) { |
427 assert(HeapShared::is_heap_object_archiving_allowed(), "Sanity"); |
424 assert(HeapShared::is_heap_object_archiving_allowed(), "Sanity"); |
428 assert(_float_mirror != NULL && _double_mirror != NULL && |
425 PRIMITIVE_MIRRORS_DO(ASSERT_MIRROR_NOT_NULL); |
429 _byte_mirror != NULL && _byte_mirror != NULL && |
|
430 _bool_mirror != NULL && _char_mirror != NULL && |
|
431 _long_mirror != NULL && _short_mirror != NULL && |
|
432 _void_mirror != NULL, "Sanity"); |
|
433 } else |
426 } else |
|
427 // _int_mirror could be NULL if archived heap is not mapped. |
434 #endif |
428 #endif |
435 { |
429 { |
436 _int_mirror = |
430 _int_mirror = |
437 java_lang_Class::create_basic_type_mirror("int", T_INT, CHECK); |
431 java_lang_Class::create_basic_type_mirror("int", T_INT, CHECK); |
438 _float_mirror = |
432 _float_mirror = |