1037 (module() == ModuleEntryTable::javabase_moduleEntry()->module())),
1038 "Incorrect java.lang.Module specification while creating mirror");
1039 set_module(mirror(), module());
1040 }
1041 }
1042
1043 // Statically allocate fixup lists because they always get created.
1044 void java_lang_Class::allocate_fixup_lists() {
1045 GrowableArray<Klass*>* mirror_list =
1046 new (mtClass) GrowableArray<Klass*>(40, mtClass);
1047 set_fixup_mirror_list(mirror_list);
1048
1049 GrowableArray<Klass*>* module_list =
1050 new (mtModule) GrowableArray<Klass*>(500, mtModule);
1051 set_fixup_module_field_list(module_list);
1052 }
1053
1054 void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protection_domain, Handle classData,
1055 Handle& mirror, Handle& comp_mirror, TRAPS) {
1056 // Allocate mirror (java.lang.Class instance)
1057 oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, CHECK);
1058 mirror = Handle(THREAD, mirror_oop);
1059
1060 // Setup indirection from mirror->klass
1061 set_klass(mirror(), k);
1062
1063 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
1064 assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
1065
1066 set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
1067
1068 // It might also have a component mirror. This mirror must already exist.
1069 if (k->is_array_klass()) {
1070 if (k->is_typeArray_klass()) {
1071 BasicType type = TypeArrayKlass::cast(k)->element_type();
1072 if (is_scratch) {
1073 comp_mirror = Handle(THREAD, HeapShared::scratch_java_mirror(type));
1074 } else {
1075 comp_mirror = Handle(THREAD, Universe::java_mirror(type));
1076 }
1077 } else {
1325 oop java_lang_Class::name(Handle java_class, TRAPS) {
1326 assert(_name_offset != 0, "must be set");
1327 oop o = java_class->obj_field(_name_offset);
1328 if (o == nullptr) {
1329 o = StringTable::intern(as_external_name(java_class()), THREAD);
1330 java_class->obj_field_put(_name_offset, o);
1331 }
1332 return o;
1333 }
1334
1335 oop java_lang_Class::source_file(oop java_class) {
1336 assert(_source_file_offset != 0, "must be set");
1337 return java_class->obj_field(_source_file_offset);
1338 }
1339
1340 void java_lang_Class::set_source_file(oop java_class, oop source_file) {
1341 assert(_source_file_offset != 0, "must be set");
1342 java_class->obj_field_put(_source_file_offset, source_file);
1343 }
1344
1345 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
1346 // This should be improved by adding a field at the Java level or by
1347 // introducing a new VM klass (see comment in ClassFileParser)
1348 oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, CHECK_NULL);
1349 if (type != T_VOID) {
1350 Klass* aklass = Universe::typeArrayKlass(type);
1351 assert(aklass != nullptr, "correct bootstrap");
1352 release_set_array_klass(java_class, aklass);
1353 }
1354 #ifdef ASSERT
1355 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());
1356 assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
1357 #endif
1358 return java_class;
1359 }
1360
1361 void java_lang_Class::set_klass(oop java_class, Klass* klass) {
1362 assert(is_instance(java_class), "must be a Class object");
1363 java_class->metadata_field_put(_klass_offset, klass);
1364 }
1365
1366
1367 void java_lang_Class::print_signature(oop java_class, outputStream* st) {
1368 assert(is_instance(java_class), "must be a Class object");
|
1037 (module() == ModuleEntryTable::javabase_moduleEntry()->module())),
1038 "Incorrect java.lang.Module specification while creating mirror");
1039 set_module(mirror(), module());
1040 }
1041 }
1042
1043 // Statically allocate fixup lists because they always get created.
1044 void java_lang_Class::allocate_fixup_lists() {
1045 GrowableArray<Klass*>* mirror_list =
1046 new (mtClass) GrowableArray<Klass*>(40, mtClass);
1047 set_fixup_mirror_list(mirror_list);
1048
1049 GrowableArray<Klass*>* module_list =
1050 new (mtModule) GrowableArray<Klass*>(500, mtModule);
1051 set_fixup_module_field_list(module_list);
1052 }
1053
1054 void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protection_domain, Handle classData,
1055 Handle& mirror, Handle& comp_mirror, TRAPS) {
1056 // Allocate mirror (java.lang.Class instance)
1057 oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, is_scratch, CHECK);
1058 mirror = Handle(THREAD, mirror_oop);
1059
1060 // Setup indirection from mirror->klass
1061 set_klass(mirror(), k);
1062
1063 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
1064 assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
1065
1066 set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
1067
1068 // It might also have a component mirror. This mirror must already exist.
1069 if (k->is_array_klass()) {
1070 if (k->is_typeArray_klass()) {
1071 BasicType type = TypeArrayKlass::cast(k)->element_type();
1072 if (is_scratch) {
1073 comp_mirror = Handle(THREAD, HeapShared::scratch_java_mirror(type));
1074 } else {
1075 comp_mirror = Handle(THREAD, Universe::java_mirror(type));
1076 }
1077 } else {
1325 oop java_lang_Class::name(Handle java_class, TRAPS) {
1326 assert(_name_offset != 0, "must be set");
1327 oop o = java_class->obj_field(_name_offset);
1328 if (o == nullptr) {
1329 o = StringTable::intern(as_external_name(java_class()), THREAD);
1330 java_class->obj_field_put(_name_offset, o);
1331 }
1332 return o;
1333 }
1334
1335 oop java_lang_Class::source_file(oop java_class) {
1336 assert(_source_file_offset != 0, "must be set");
1337 return java_class->obj_field(_source_file_offset);
1338 }
1339
1340 void java_lang_Class::set_source_file(oop java_class, oop source_file) {
1341 assert(_source_file_offset != 0, "must be set");
1342 java_class->obj_field_put(_source_file_offset, source_file);
1343 }
1344
1345 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, bool is_scratch, TRAPS) {
1346 // This should be improved by adding a field at the Java level or by
1347 // introducing a new VM klass (see comment in ClassFileParser)
1348 oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, is_scratch, CHECK_NULL);
1349 if (type != T_VOID) {
1350 Klass* aklass = Universe::typeArrayKlass(type);
1351 assert(aklass != nullptr, "correct bootstrap");
1352 release_set_array_klass(java_class, aklass);
1353 }
1354 #ifdef ASSERT
1355 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());
1356 assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
1357 #endif
1358 return java_class;
1359 }
1360
1361 void java_lang_Class::set_klass(oop java_class, Klass* klass) {
1362 assert(is_instance(java_class), "must be a Class object");
1363 java_class->metadata_field_put(_klass_offset, klass);
1364 }
1365
1366
1367 void java_lang_Class::print_signature(oop java_class, outputStream* st) {
1368 assert(is_instance(java_class), "must be a Class object");
|