< prev index next >

src/share/vm/classfile/javaClasses.cpp

Print this page

        

*** 816,825 **** --- 816,826 ---- } } void java_lang_Class::create_mirror(Klass* k, Handle class_loader, Handle module, Handle protection_domain, TRAPS) { + assert(k != NULL, "Use create_basic_type_mirror for primitive types"); assert(k->java_mirror() == NULL, "should only assign mirror once"); // Use this moment of initialization to cache modifier_flags also, // to support Class.getModifiers(). Instance classes recalculate // the cached flags after the class file is parsed, but before the // class is put into the system dictionary.
*** 829,867 **** // 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); // Setup indirection from mirror->klass - if (k != NULL) { java_lang_Class::set_klass(mirror(), k); - } InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass()); assert(oop_size(mirror()) == mk->instance_size(k), "should have been set"); 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) { --- 830,867 ---- // 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 java_lang_Class::set_klass(mirror(), k); InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass()); assert(oop_size(mirror()) == mk->instance_size(k), "should have been set"); 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()); ! // See below for ordering dependencies between field array_klass in component mirror ! // and java_mirror in this klass. } 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); --- 879,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 after k->java_mirror() is published, because compiled code running + // concurrently doesn't expect a k to have a null java_mirror. + release_set_array_klass(comp_mirror(), k); } } else { if (fixup_mirror_list() == NULL) { GrowableArray<Klass*>* list = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, true);
*** 987,997 **** // introducing a new VM klass (see comment in ClassFileParser) oop java_class = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(NULL, CHECK_0); if (type != T_VOID) { Klass* aklass = Universe::typeArrayKlassObj(type); assert(aklass != NULL, "correct bootstrap"); ! set_array_klass(java_class, aklass); } #ifdef ASSERT InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(SystemDictionary::Class_klass()); assert(java_lang_Class::static_oop_field_count(java_class) == 0, "should have been zeroed by allocation"); #endif --- 990,1000 ---- // introducing a new VM klass (see comment in ClassFileParser) oop java_class = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(NULL, CHECK_0); if (type != T_VOID) { Klass* aklass = Universe::typeArrayKlassObj(type); assert(aklass != NULL, "correct bootstrap"); ! release_set_array_klass(java_class, aklass); } #ifdef ASSERT InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(SystemDictionary::Class_klass()); assert(java_lang_Class::static_oop_field_count(java_class) == 0, "should have been zeroed by allocation"); #endif
*** 1084,1096 **** assert(k == NULL || k->is_klass() && k->is_array_klass(), "should be array klass"); return k; } ! 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: --- 1087,1099 ---- assert(k == NULL || k->is_klass() && k->is_array_klass(), "should be array klass"); return k; } ! void java_lang_Class::release_set_array_klass(oop java_class, Klass* klass) { assert(klass->is_klass() && klass->is_array_klass(), "should be array klass"); ! java_class->release_metadata_field_put(_array_klass_offset, klass); } bool java_lang_Class::is_primitive(oop java_class) { // should assert:
< prev index next >