< prev index next >
src/share/vm/classfile/javaClasses.cpp
Print this page
@@ -829,10 +829,11 @@
// 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,26 +843,27 @@
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);
+ 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 = element_klass->java_mirror();
+ comp_mirror = Handle(THREAD, element_klass->java_mirror());
}
- assert(comp_mirror != NULL, "must have a 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);
+ 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,14 +881,15 @@
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
+ // Setup indirection from klass->mirror
// after any exceptions can happen during allocations.
- if (k != NULL) {
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,11 +1089,11 @@
}
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);
+ java_class->metadata_field_put_volatile(_array_klass_offset, klass);
}
bool java_lang_Class::is_primitive(oop java_class) {
// should assert:
< prev index next >