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