< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page




 885   // Class_klass has to be loaded because it is used to allocate
 886   // the mirror.
 887   if (SystemDictionary::Class_klass_loaded()) {
 888     // Allocate mirror (java.lang.Class instance)
 889     oop mirror_oop = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK);
 890     Handle mirror(THREAD, mirror_oop);
 891     Handle comp_mirror;
 892 
 893     // Setup indirection from mirror->klass
 894     java_lang_Class::set_klass(mirror(), k);
 895 
 896     InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
 897     assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
 898 
 899     java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
 900 
 901     // It might also have a component mirror.  This mirror must already exist.
 902     if (k->is_array_klass()) {
 903       if (k->is_valueArray_klass()) {
 904         Klass* element_klass = (Klass*) ValueArrayKlass::cast(k)->element_klass();
 905         if (element_klass->is_value()) {
 906           ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(element_klass));
 907           comp_mirror = Handle(THREAD, vk->value_mirror());
 908         } else {
 909           comp_mirror = Handle(THREAD, element_klass->java_mirror());
 910         }
 911       }
 912       else if (k->is_typeArray_klass()) {
 913         BasicType type = TypeArrayKlass::cast(k)->element_type();
 914         comp_mirror = Handle(THREAD, Universe::java_mirror(type));
 915       } else {
 916         assert(k->is_objArray_klass(), "Must be");
 917         Klass* element_klass = ObjArrayKlass::cast(k)->element_klass();
 918         assert(element_klass != NULL, "Must have an element klass");
 919         if (element_klass->is_value()) {
 920           ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(element_klass));
 921           comp_mirror = Handle(THREAD, vk->value_mirror());
 922         } else {
 923           comp_mirror = Handle(THREAD, element_klass->java_mirror());
 924         }
 925       }
 926       assert(comp_mirror() != NULL, "must have a mirror");
 927 
 928       // Two-way link between the array klass and its component mirror:
 929       // (array_klass) k -> mirror -> component_mirror -> array_klass -> k
 930       set_component_mirror(mirror(), comp_mirror());
 931       // See below for ordering dependencies between field array_klass in component mirror
 932       // and java_mirror in this klass.
 933     } else {
 934       assert(k->is_instance_klass(), "Must be");
 935 
 936       initialize_mirror_fields(k, mirror, protection_domain, THREAD);
 937       if (HAS_PENDING_EXCEPTION) {
 938         // If any of the fields throws an exception like OOM remove the klass field
 939         // from the mirror so GC doesn't follow it after the klass has been deallocated.




 885   // Class_klass has to be loaded because it is used to allocate
 886   // the mirror.
 887   if (SystemDictionary::Class_klass_loaded()) {
 888     // Allocate mirror (java.lang.Class instance)
 889     oop mirror_oop = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK);
 890     Handle mirror(THREAD, mirror_oop);
 891     Handle comp_mirror;
 892 
 893     // Setup indirection from mirror->klass
 894     java_lang_Class::set_klass(mirror(), k);
 895 
 896     InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
 897     assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
 898 
 899     java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
 900 
 901     // It might also have a component mirror.  This mirror must already exist.
 902     if (k->is_array_klass()) {
 903       if (k->is_valueArray_klass()) {
 904         Klass* element_klass = (Klass*) ValueArrayKlass::cast(k)->element_klass();
 905         assert(element_klass->is_value(), "Must be value type component");
 906         ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(element_klass));
 907         comp_mirror = Handle(THREAD, vk->value_mirror());



 908       }
 909       else if (k->is_typeArray_klass()) {
 910         BasicType type = TypeArrayKlass::cast(k)->element_type();
 911         comp_mirror = Handle(THREAD, Universe::java_mirror(type));
 912       } else {
 913         assert(k->is_objArray_klass(), "Must be");
 914         Klass* element_klass = ObjArrayKlass::cast(k)->element_klass();
 915         assert(element_klass != NULL, "Must have an element klass");
 916         if (element_klass->is_value() && k->name()->is_Q_array_signature()) {
 917           ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(element_klass));
 918           comp_mirror = Handle(THREAD, vk->value_mirror());
 919         } else {
 920           comp_mirror = Handle(THREAD, element_klass->java_mirror());
 921         }
 922       }
 923       assert(comp_mirror() != NULL, "must have a mirror");
 924 
 925       // Two-way link between the array klass and its component mirror:
 926       // (array_klass) k -> mirror -> component_mirror -> array_klass -> k
 927       set_component_mirror(mirror(), comp_mirror());
 928       // See below for ordering dependencies between field array_klass in component mirror
 929       // and java_mirror in this klass.
 930     } else {
 931       assert(k->is_instance_klass(), "Must be");
 932 
 933       initialize_mirror_fields(k, mirror, protection_domain, THREAD);
 934       if (HAS_PENDING_EXCEPTION) {
 935         // If any of the fields throws an exception like OOM remove the klass field
 936         // from the mirror so GC doesn't follow it after the klass has been deallocated.


< prev index next >