< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page

1065 // Statically allocate fixup lists because they always get created.
1066 void java_lang_Class::allocate_fixup_lists() {
1067   if (!CDSConfig::is_using_aot_linked_classes()) {
1068     // fixup_mirror_list() is not used when we have preloaded classes. See
1069     // Universe::fixup_mirrors().
1070     GrowableArray<Klass*>* mirror_list =
1071       new (mtClass) GrowableArray<Klass*>(40, mtClass);
1072     set_fixup_mirror_list(mirror_list);
1073 
1074     // With AOT-linked classes, java.base module is defined before any class
1075     // is loaded, so there's no need for fixup_module_field_list().
1076     GrowableArray<Klass*>* module_list =
1077       new (mtModule) GrowableArray<Klass*>(500, mtModule);
1078     set_fixup_module_field_list(module_list);
1079   }
1080 }
1081 
1082 void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protection_domain, Handle classData,
1083                                       Handle& mirror, Handle& comp_mirror, TRAPS) {
1084   // Allocate mirror (java.lang.Class instance)
1085   oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, CHECK);
1086   mirror = Handle(THREAD, mirror_oop);
1087 
1088   // Setup indirection from mirror->klass
1089   set_klass(mirror(), k);
1090 
1091   // Set the modifiers flag.
1092   u2 computed_modifiers = k->compute_modifier_flags();
1093   set_modifiers(mirror(), computed_modifiers);
1094   // Set the raw access_flags, this is used by reflection instead of modifier flags.
1095   // The Java code for array classes gets the access flags from the element type.
1096   assert(!k->is_array_klass() || k->access_flags().as_unsigned_short() == 0, "access flags are not set for arrays");
1097   set_raw_access_flags(mirror(), k->access_flags().as_unsigned_short());
1098 
1099   InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
1100   assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
1101 
1102   set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
1103 
1104   // It might also have a component mirror.  This mirror must already exist.
1105   if (k->is_array_klass()) {

1362   }
1363   return o;
1364 }
1365 
1366 oop java_lang_Class::source_file(oop java_class) {
1367   assert(_source_file_offset != 0, "must be set");
1368   return java_class->obj_field(_source_file_offset);
1369 }
1370 
1371 void java_lang_Class::set_source_file(oop java_class, oop source_file) {
1372   assert(_source_file_offset != 0, "must be set");
1373   java_class->obj_field_put(_source_file_offset, source_file);
1374 }
1375 
1376 void java_lang_Class::set_is_primitive(oop java_class) {
1377   assert(_is_primitive_offset != 0, "must be set");
1378   java_class->bool_field_put(_is_primitive_offset, true);
1379 }
1380 
1381 
1382 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
1383   // Mirrors for basic types have a null klass field, which makes them special.
1384   oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, CHECK_NULL);
1385   if (type != T_VOID) {
1386     Klass* aklass = Universe::typeArrayKlass(type);
1387     assert(aklass != nullptr, "correct bootstrap");
1388     release_set_array_klass(java_class, aklass);
1389   }
1390 #ifdef ASSERT
1391   InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());
1392   assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
1393 #endif
1394   set_modifiers(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1395   set_raw_access_flags(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1396 
1397   set_is_primitive(java_class);
1398   return java_class;
1399 }
1400 
1401 void java_lang_Class::set_klass(oop java_class, Klass* klass) {
1402   assert(is_instance(java_class), "must be a Class object");
1403   java_class->metadata_field_put(_klass_offset, klass);
1404 }

1065 // Statically allocate fixup lists because they always get created.
1066 void java_lang_Class::allocate_fixup_lists() {
1067   if (!CDSConfig::is_using_aot_linked_classes()) {
1068     // fixup_mirror_list() is not used when we have preloaded classes. See
1069     // Universe::fixup_mirrors().
1070     GrowableArray<Klass*>* mirror_list =
1071       new (mtClass) GrowableArray<Klass*>(40, mtClass);
1072     set_fixup_mirror_list(mirror_list);
1073 
1074     // With AOT-linked classes, java.base module is defined before any class
1075     // is loaded, so there's no need for fixup_module_field_list().
1076     GrowableArray<Klass*>* module_list =
1077       new (mtModule) GrowableArray<Klass*>(500, mtModule);
1078     set_fixup_module_field_list(module_list);
1079   }
1080 }
1081 
1082 void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protection_domain, Handle classData,
1083                                       Handle& mirror, Handle& comp_mirror, TRAPS) {
1084   // Allocate mirror (java.lang.Class instance)
1085   oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, is_scratch, CHECK);
1086   mirror = Handle(THREAD, mirror_oop);
1087 
1088   // Setup indirection from mirror->klass
1089   set_klass(mirror(), k);
1090 
1091   // Set the modifiers flag.
1092   u2 computed_modifiers = k->compute_modifier_flags();
1093   set_modifiers(mirror(), computed_modifiers);
1094   // Set the raw access_flags, this is used by reflection instead of modifier flags.
1095   // The Java code for array classes gets the access flags from the element type.
1096   assert(!k->is_array_klass() || k->access_flags().as_unsigned_short() == 0, "access flags are not set for arrays");
1097   set_raw_access_flags(mirror(), k->access_flags().as_unsigned_short());
1098 
1099   InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
1100   assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
1101 
1102   set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
1103 
1104   // It might also have a component mirror.  This mirror must already exist.
1105   if (k->is_array_klass()) {

1362   }
1363   return o;
1364 }
1365 
1366 oop java_lang_Class::source_file(oop java_class) {
1367   assert(_source_file_offset != 0, "must be set");
1368   return java_class->obj_field(_source_file_offset);
1369 }
1370 
1371 void java_lang_Class::set_source_file(oop java_class, oop source_file) {
1372   assert(_source_file_offset != 0, "must be set");
1373   java_class->obj_field_put(_source_file_offset, source_file);
1374 }
1375 
1376 void java_lang_Class::set_is_primitive(oop java_class) {
1377   assert(_is_primitive_offset != 0, "must be set");
1378   java_class->bool_field_put(_is_primitive_offset, true);
1379 }
1380 
1381 
1382 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, bool is_scratch, TRAPS) {
1383   // Mirrors for basic types have a null klass field, which makes them special.
1384   oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, is_scratch, CHECK_NULL);
1385   if (type != T_VOID) {
1386     Klass* aklass = Universe::typeArrayKlass(type);
1387     assert(aklass != nullptr, "correct bootstrap");
1388     release_set_array_klass(java_class, aklass);
1389   }
1390 #ifdef ASSERT
1391   InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());
1392   assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
1393 #endif
1394   set_modifiers(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1395   set_raw_access_flags(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1396 
1397   set_is_primitive(java_class);
1398   return java_class;
1399 }
1400 
1401 void java_lang_Class::set_klass(oop java_class, Klass* klass) {
1402   assert(is_instance(java_class), "must be a Class object");
1403   java_class->metadata_field_put(_klass_offset, klass);
1404 }
< prev index next >