< prev index next >
src/share/vm/classfile/javaClasses.cpp
Print this page
*** 829,838 ****
--- 829,839 ----
// the mirror.
if (SystemDictionary::Class_klass_loaded()) {
// Allocate mirror (java.lang.Class instance)
oop mirror_oop = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK);
Handle mirror(THREAD, mirror_oop);
+ Handle comp_mirror;
// Setup indirection from mirror->klass
if (k != NULL) {
java_lang_Class::set_klass(mirror(), k);
}
*** 842,867 ****
java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
// It might also have a component mirror. This mirror must already exist.
if (k->is_array_klass()) {
- oop comp_mirror;
if (k->is_typeArray_klass()) {
BasicType type = TypeArrayKlass::cast(k)->element_type();
! comp_mirror = Universe::java_mirror(type);
} else {
assert(k->is_objArray_klass(), "Must be");
Klass* element_klass = ObjArrayKlass::cast(k)->element_klass();
assert(element_klass != NULL, "Must have an element klass");
! comp_mirror = element_klass->java_mirror();
}
! assert(comp_mirror != NULL, "must have a mirror");
// Two-way link between the array klass and its component mirror:
// (array_klass) k -> mirror -> component_mirror -> array_klass -> k
! set_component_mirror(mirror(), comp_mirror);
! set_array_klass(comp_mirror, k);
} else {
assert(k->is_instance_klass(), "Must be");
initialize_mirror_fields(k, mirror, protection_domain, THREAD);
if (HAS_PENDING_EXCEPTION) {
--- 843,869 ----
java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
// It might also have a component mirror. This mirror must already exist.
if (k->is_array_klass()) {
if (k->is_typeArray_klass()) {
BasicType type = TypeArrayKlass::cast(k)->element_type();
! comp_mirror = Handle(THREAD, Universe::java_mirror(type));
} else {
assert(k->is_objArray_klass(), "Must be");
Klass* element_klass = ObjArrayKlass::cast(k)->element_klass();
assert(element_klass != NULL, "Must have an element klass");
! comp_mirror = Handle(THREAD, element_klass->java_mirror());
}
! assert(comp_mirror() != NULL, "must have a mirror");
// Two-way link between the array klass and its component mirror:
// (array_klass) k -> mirror -> component_mirror -> array_klass -> k
! set_component_mirror(mirror(), comp_mirror());
! // Set after k->java_mirror() is published, because compiled code running
! // concurrently doesn't expect a k to have a null java_mirror.
! // set_array_klass(comp_mirror, k);
} else {
assert(k->is_instance_klass(), "Must be");
initialize_mirror_fields(k, mirror, protection_domain, THREAD);
if (HAS_PENDING_EXCEPTION) {
*** 879,892 ****
set_class_loader(mirror(), class_loader());
// set the module field in the java_lang_Class instance
set_mirror_module_field(k, mirror, module, THREAD);
! // Setup indirection from klass->mirror last
// after any exceptions can happen during allocations.
- if (k != NULL) {
k->set_java_mirror(mirror());
}
} else {
if (fixup_mirror_list() == NULL) {
GrowableArray<Klass*>* list =
new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, true);
--- 881,895 ----
set_class_loader(mirror(), class_loader());
// set the module field in the java_lang_Class instance
set_mirror_module_field(k, mirror, module, THREAD);
! // Setup indirection from klass->mirror
// after any exceptions can happen during allocations.
k->set_java_mirror(mirror());
+ if (comp_mirror() != NULL) {
+ set_array_klass(comp_mirror(), k);
}
} else {
if (fixup_mirror_list() == NULL) {
GrowableArray<Klass*>* list =
new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, true);
*** 1086,1096 ****
}
void java_lang_Class::set_array_klass(oop java_class, Klass* klass) {
assert(klass->is_klass() && klass->is_array_klass(), "should be array klass");
! java_class->metadata_field_put(_array_klass_offset, klass);
}
bool java_lang_Class::is_primitive(oop java_class) {
// should assert:
--- 1089,1099 ----
}
void java_lang_Class::set_array_klass(oop java_class, Klass* klass) {
assert(klass->is_klass() && klass->is_array_klass(), "should be array klass");
! java_class->metadata_field_put_volatile(_array_klass_offset, klass);
}
bool java_lang_Class::is_primitive(oop java_class) {
// should assert:
< prev index next >