46 #include "runtime/handles.inline.hpp" 47 #include "runtime/mutexLocker.hpp" 48 #include "utilities/macros.hpp" 49 50 ObjArrayKlass* ObjArrayKlass::allocate(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS) { 51 assert(ObjArrayKlass::header_size() <= InstanceKlass::header_size(), 52 "array klasses must be same size as InstanceKlass"); 53 54 int size = ArrayKlass::static_size(ObjArrayKlass::header_size()); 55 56 return new (loader_data, size, THREAD) ObjArrayKlass(n, k, name); 57 } 58 59 Klass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data, 60 int n, Klass* element_klass, TRAPS) { 61 62 // Eagerly allocate the direct array supertype. 63 Klass* super_klass = NULL; 64 if (!Universe::is_bootstrapping() || SystemDictionary::Object_klass_loaded()) { 65 Klass* element_super = element_klass->super(); 66 if (element_super == SystemDictionary::___Value_klass()) { 67 element_super = NULL; 68 } 69 if (element_super != NULL) { 70 // The element type has a direct super. E.g., String[] has direct super of Object[]. 71 super_klass = element_super->array_klass_or_null(); 72 bool supers_exist = super_klass != NULL; 73 // Also, see if the element has secondary supertypes. 74 // We need an array type for each. 75 Array<Klass*>* element_supers = element_klass->secondary_supers(); 76 for( int i = element_supers->length()-1; i >= 0; i-- ) { 77 Klass* elem_super = element_supers->at(i); 78 if (elem_super->array_klass_or_null() == NULL) { 79 supers_exist = false; 80 break; 81 } 82 } 83 if (!supers_exist) { 84 // Oops. Not allocated yet. Back out, allocate it, and retry. 85 Klass* ek = NULL; 86 { 87 MutexUnlocker mu(MultiArray_lock); 88 MutexUnlocker mc(Compile_lock); // for vtables | 46 #include "runtime/handles.inline.hpp" 47 #include "runtime/mutexLocker.hpp" 48 #include "utilities/macros.hpp" 49 50 ObjArrayKlass* ObjArrayKlass::allocate(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS) { 51 assert(ObjArrayKlass::header_size() <= InstanceKlass::header_size(), 52 "array klasses must be same size as InstanceKlass"); 53 54 int size = ArrayKlass::static_size(ObjArrayKlass::header_size()); 55 56 return new (loader_data, size, THREAD) ObjArrayKlass(n, k, name); 57 } 58 59 Klass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data, 60 int n, Klass* element_klass, TRAPS) { 61 62 // Eagerly allocate the direct array supertype. 63 Klass* super_klass = NULL; 64 if (!Universe::is_bootstrapping() || SystemDictionary::Object_klass_loaded()) { 65 Klass* element_super = element_klass->super(); 66 if (element_super != NULL) { 67 // The element type has a direct super. E.g., String[] has direct super of Object[]. 68 super_klass = element_super->array_klass_or_null(); 69 bool supers_exist = super_klass != NULL; 70 // Also, see if the element has secondary supertypes. 71 // We need an array type for each. 72 Array<Klass*>* element_supers = element_klass->secondary_supers(); 73 for( int i = element_supers->length()-1; i >= 0; i-- ) { 74 Klass* elem_super = element_supers->at(i); 75 if (elem_super->array_klass_or_null() == NULL) { 76 supers_exist = false; 77 break; 78 } 79 } 80 if (!supers_exist) { 81 // Oops. Not allocated yet. Back out, allocate it, and retry. 82 Klass* ek = NULL; 83 { 84 MutexUnlocker mu(MultiArray_lock); 85 MutexUnlocker mc(Compile_lock); // for vtables |