< 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 >