1040 (module() == ModuleEntryTable::javabase_moduleEntry()->module())),
1041 "Incorrect java.lang.Module specification while creating mirror");
1042 set_module(mirror(), module());
1043 }
1044 }
1045
1046 // Statically allocate fixup lists because they always get created.
1047 void java_lang_Class::allocate_fixup_lists() {
1048 GrowableArray<Klass*>* mirror_list =
1049 new (mtClass) GrowableArray<Klass*>(40, mtClass);
1050 set_fixup_mirror_list(mirror_list);
1051
1052 GrowableArray<Klass*>* module_list =
1053 new (mtModule) GrowableArray<Klass*>(500, mtModule);
1054 set_fixup_module_field_list(module_list);
1055 }
1056
1057 void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protection_domain, Handle classData,
1058 Handle& mirror, Handle& comp_mirror, TRAPS) {
1059 // Allocate mirror (java.lang.Class instance)
1060 oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, CHECK);
1061 mirror = Handle(THREAD, mirror_oop);
1062
1063 // Setup indirection from mirror->klass
1064 set_klass(mirror(), k);
1065
1066 // Set the modifiers flag.
1067 u2 computed_modifiers = k->compute_modifier_flags();
1068 set_modifiers(mirror(), computed_modifiers);
1069
1070 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
1071 assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
1072
1073 set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
1074
1075 // It might also have a component mirror. This mirror must already exist.
1076 if (k->is_array_klass()) {
1077 if (k->is_typeArray_klass()) {
1078 BasicType type = TypeArrayKlass::cast(k)->element_type();
1079 if (is_scratch) {
1080 comp_mirror = Handle(THREAD, HeapShared::scratch_java_mirror(type));
1341 }
1342 return o;
1343 }
1344
1345 oop java_lang_Class::source_file(oop java_class) {
1346 assert(_source_file_offset != 0, "must be set");
1347 return java_class->obj_field(_source_file_offset);
1348 }
1349
1350 void java_lang_Class::set_source_file(oop java_class, oop source_file) {
1351 assert(_source_file_offset != 0, "must be set");
1352 java_class->obj_field_put(_source_file_offset, source_file);
1353 }
1354
1355 void java_lang_Class::set_is_primitive(oop java_class) {
1356 assert(_is_primitive_offset != 0, "must be set");
1357 java_class->bool_field_put(_is_primitive_offset, true);
1358 }
1359
1360
1361 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
1362 // Mirrors for basic types have a null klass field, which makes them special.
1363 oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, CHECK_NULL);
1364 if (type != T_VOID) {
1365 Klass* aklass = Universe::typeArrayKlass(type);
1366 assert(aklass != nullptr, "correct bootstrap");
1367 release_set_array_klass(java_class, aklass);
1368 }
1369 #ifdef ASSERT
1370 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());
1371 assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
1372 #endif
1373 set_modifiers(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1374 set_is_primitive(java_class);
1375 return java_class;
1376 }
1377
1378 void java_lang_Class::set_klass(oop java_class, Klass* klass) {
1379 assert(is_instance(java_class), "must be a Class object");
1380 java_class->metadata_field_put(_klass_offset, klass);
1381 }
1382
1383
|
1040 (module() == ModuleEntryTable::javabase_moduleEntry()->module())),
1041 "Incorrect java.lang.Module specification while creating mirror");
1042 set_module(mirror(), module());
1043 }
1044 }
1045
1046 // Statically allocate fixup lists because they always get created.
1047 void java_lang_Class::allocate_fixup_lists() {
1048 GrowableArray<Klass*>* mirror_list =
1049 new (mtClass) GrowableArray<Klass*>(40, mtClass);
1050 set_fixup_mirror_list(mirror_list);
1051
1052 GrowableArray<Klass*>* module_list =
1053 new (mtModule) GrowableArray<Klass*>(500, mtModule);
1054 set_fixup_module_field_list(module_list);
1055 }
1056
1057 void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protection_domain, Handle classData,
1058 Handle& mirror, Handle& comp_mirror, TRAPS) {
1059 // Allocate mirror (java.lang.Class instance)
1060 oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, is_scratch, CHECK);
1061 mirror = Handle(THREAD, mirror_oop);
1062
1063 // Setup indirection from mirror->klass
1064 set_klass(mirror(), k);
1065
1066 // Set the modifiers flag.
1067 u2 computed_modifiers = k->compute_modifier_flags();
1068 set_modifiers(mirror(), computed_modifiers);
1069
1070 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
1071 assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
1072
1073 set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
1074
1075 // It might also have a component mirror. This mirror must already exist.
1076 if (k->is_array_klass()) {
1077 if (k->is_typeArray_klass()) {
1078 BasicType type = TypeArrayKlass::cast(k)->element_type();
1079 if (is_scratch) {
1080 comp_mirror = Handle(THREAD, HeapShared::scratch_java_mirror(type));
1341 }
1342 return o;
1343 }
1344
1345 oop java_lang_Class::source_file(oop java_class) {
1346 assert(_source_file_offset != 0, "must be set");
1347 return java_class->obj_field(_source_file_offset);
1348 }
1349
1350 void java_lang_Class::set_source_file(oop java_class, oop source_file) {
1351 assert(_source_file_offset != 0, "must be set");
1352 java_class->obj_field_put(_source_file_offset, source_file);
1353 }
1354
1355 void java_lang_Class::set_is_primitive(oop java_class) {
1356 assert(_is_primitive_offset != 0, "must be set");
1357 java_class->bool_field_put(_is_primitive_offset, true);
1358 }
1359
1360
1361 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, bool is_scratch, TRAPS) {
1362 // Mirrors for basic types have a null klass field, which makes them special.
1363 oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, is_scratch, CHECK_NULL);
1364 if (type != T_VOID) {
1365 Klass* aklass = Universe::typeArrayKlass(type);
1366 assert(aklass != nullptr, "correct bootstrap");
1367 release_set_array_klass(java_class, aklass);
1368 }
1369 #ifdef ASSERT
1370 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());
1371 assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
1372 #endif
1373 set_modifiers(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1374 set_is_primitive(java_class);
1375 return java_class;
1376 }
1377
1378 void java_lang_Class::set_klass(oop java_class, Klass* klass) {
1379 assert(is_instance(java_class), "must be a Class object");
1380 java_class->metadata_field_put(_klass_offset, klass);
1381 }
1382
1383
|