< prev index next >

src/hotspot/share/oops/objArrayKlass.cpp

Print this page

        

*** 57,67 **** Klass* ObjArrayKlass::allocate_objArray_klass(ArrayStorageProperties storage_props, int n, Klass* element_klass, TRAPS) { // Eagerly allocate the direct array supertype. Klass* super_klass = NULL; ! if (!Universe::is_bootstrapping() || SystemDictionary::Object_klass_loaded()) { Klass* element_super = element_klass->super(); if (element_super != NULL) { // The element type has a direct super. E.g., String[] has direct super of Object[]. super_klass = element_super->array_klass_or_null(ArrayStorageProperties::empty); bool supers_exist = super_klass != NULL; --- 57,77 ---- Klass* ObjArrayKlass::allocate_objArray_klass(ArrayStorageProperties storage_props, int n, Klass* element_klass, TRAPS) { // Eagerly allocate the direct array supertype. Klass* super_klass = NULL; ! if (storage_props.is_null_free()) { ! assert(!Universe::is_bootstrapping(), "Need bootstrap"); ! // Arrange null ok as direct super ! super_klass = element_klass->array_klass_or_null(ArrayStorageProperties::empty, n); ! if (super_klass == NULL) { // allocate super...need to drop the lock ! MutexUnlocker mu(MultiArray_lock); ! element_klass->array_klass(ArrayStorageProperties::empty, n, CHECK_NULL); ! // retry, start from the beginning since lock dropped... ! return element_klass->array_klass(storage_props, n, CHECK_NULL); ! } ! } else if (!Universe::is_bootstrapping() || SystemDictionary::Object_klass_loaded()) { Klass* element_super = element_klass->super(); if (element_super != NULL) { // The element type has a direct super. E.g., String[] has direct super of Object[]. super_klass = element_super->array_klass_or_null(ArrayStorageProperties::empty); bool supers_exist = super_klass != NULL;
< prev index next >