1062 // Statically allocate fixup lists because they always get created.
1063 void java_lang_Class::allocate_fixup_lists() {
1064 if (!CDSConfig::is_using_aot_linked_classes()) {
1065 // fixup_mirror_list() is not used when we have preloaded classes. See
1066 // Universe::fixup_mirrors().
1067 GrowableArray<Klass*>* mirror_list =
1068 new (mtClass) GrowableArray<Klass*>(40, mtClass);
1069 set_fixup_mirror_list(mirror_list);
1070
1071 // With AOT-linked classes, java.base module is defined before any class
1072 // is loaded, so there's no need for fixup_module_field_list().
1073 GrowableArray<Klass*>* module_list =
1074 new (mtModule) GrowableArray<Klass*>(500, mtModule);
1075 set_fixup_module_field_list(module_list);
1076 }
1077 }
1078
1079 void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protection_domain, Handle classData,
1080 Handle& mirror, Handle& comp_mirror, TRAPS) {
1081 // Allocate mirror (java.lang.Class instance)
1082 oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, CHECK);
1083 mirror = Handle(THREAD, mirror_oop);
1084
1085 // Setup indirection from mirror->klass
1086 set_klass(mirror(), k);
1087
1088 // Set the modifiers flag.
1089 u2 computed_modifiers = k->compute_modifier_flags();
1090 set_modifiers(mirror(), computed_modifiers);
1091
1092 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
1093 assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
1094
1095 set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
1096
1097 // It might also have a component mirror. This mirror must already exist.
1098 if (k->is_array_klass()) {
1099 // The Java code for array classes gets the access flags from the element type.
1100 set_raw_access_flags(mirror(), 0);
1101 if (k->is_typeArray_klass()) {
1102 BasicType type = TypeArrayKlass::cast(k)->element_type();
1363 }
1364 return o;
1365 }
1366
1367 oop java_lang_Class::source_file(oop java_class) {
1368 assert(_source_file_offset != 0, "must be set");
1369 return java_class->obj_field(_source_file_offset);
1370 }
1371
1372 void java_lang_Class::set_source_file(oop java_class, oop source_file) {
1373 assert(_source_file_offset != 0, "must be set");
1374 java_class->obj_field_put(_source_file_offset, source_file);
1375 }
1376
1377 void java_lang_Class::set_is_primitive(oop java_class) {
1378 assert(_is_primitive_offset != 0, "must be set");
1379 java_class->bool_field_put(_is_primitive_offset, true);
1380 }
1381
1382
1383 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
1384 // Mirrors for basic types have a null klass field, which makes them special.
1385 oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, CHECK_NULL);
1386 if (type != T_VOID) {
1387 Klass* aklass = Universe::typeArrayKlass(type);
1388 assert(aklass != nullptr, "correct bootstrap");
1389 release_set_array_klass(java_class, aklass);
1390 }
1391 #ifdef ASSERT
1392 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());
1393 assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
1394 #endif
1395 set_modifiers(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1396 set_raw_access_flags(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1397
1398 set_is_primitive(java_class);
1399 return java_class;
1400 }
1401
1402 void java_lang_Class::set_klass(oop java_class, Klass* klass) {
1403 assert(is_instance(java_class), "must be a Class object");
1404 java_class->metadata_field_put(_klass_offset, klass);
1405 }
|
1062 // Statically allocate fixup lists because they always get created.
1063 void java_lang_Class::allocate_fixup_lists() {
1064 if (!CDSConfig::is_using_aot_linked_classes()) {
1065 // fixup_mirror_list() is not used when we have preloaded classes. See
1066 // Universe::fixup_mirrors().
1067 GrowableArray<Klass*>* mirror_list =
1068 new (mtClass) GrowableArray<Klass*>(40, mtClass);
1069 set_fixup_mirror_list(mirror_list);
1070
1071 // With AOT-linked classes, java.base module is defined before any class
1072 // is loaded, so there's no need for fixup_module_field_list().
1073 GrowableArray<Klass*>* module_list =
1074 new (mtModule) GrowableArray<Klass*>(500, mtModule);
1075 set_fixup_module_field_list(module_list);
1076 }
1077 }
1078
1079 void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protection_domain, Handle classData,
1080 Handle& mirror, Handle& comp_mirror, TRAPS) {
1081 // Allocate mirror (java.lang.Class instance)
1082 oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, is_scratch, CHECK);
1083 mirror = Handle(THREAD, mirror_oop);
1084
1085 // Setup indirection from mirror->klass
1086 set_klass(mirror(), k);
1087
1088 // Set the modifiers flag.
1089 u2 computed_modifiers = k->compute_modifier_flags();
1090 set_modifiers(mirror(), computed_modifiers);
1091
1092 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
1093 assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
1094
1095 set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
1096
1097 // It might also have a component mirror. This mirror must already exist.
1098 if (k->is_array_klass()) {
1099 // The Java code for array classes gets the access flags from the element type.
1100 set_raw_access_flags(mirror(), 0);
1101 if (k->is_typeArray_klass()) {
1102 BasicType type = TypeArrayKlass::cast(k)->element_type();
1363 }
1364 return o;
1365 }
1366
1367 oop java_lang_Class::source_file(oop java_class) {
1368 assert(_source_file_offset != 0, "must be set");
1369 return java_class->obj_field(_source_file_offset);
1370 }
1371
1372 void java_lang_Class::set_source_file(oop java_class, oop source_file) {
1373 assert(_source_file_offset != 0, "must be set");
1374 java_class->obj_field_put(_source_file_offset, source_file);
1375 }
1376
1377 void java_lang_Class::set_is_primitive(oop java_class) {
1378 assert(_is_primitive_offset != 0, "must be set");
1379 java_class->bool_field_put(_is_primitive_offset, true);
1380 }
1381
1382
1383 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, bool is_scratch, TRAPS) {
1384 // Mirrors for basic types have a null klass field, which makes them special.
1385 oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, is_scratch, CHECK_NULL);
1386 if (type != T_VOID) {
1387 Klass* aklass = Universe::typeArrayKlass(type);
1388 assert(aklass != nullptr, "correct bootstrap");
1389 release_set_array_klass(java_class, aklass);
1390 }
1391 #ifdef ASSERT
1392 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());
1393 assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
1394 #endif
1395 set_modifiers(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1396 set_raw_access_flags(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1397
1398 set_is_primitive(java_class);
1399 return java_class;
1400 }
1401
1402 void java_lang_Class::set_klass(oop java_class, Klass* klass) {
1403 assert(is_instance(java_class), "must be a Class object");
1404 java_class->metadata_field_put(_klass_offset, klass);
1405 }
|