< prev index next >

src/hotspot/share/oops/valueArrayKlass.cpp

Print this page

        

*** 79,139 **** void ValueArrayKlass::set_element_klass(Klass* k) { _element_klass = k; } ! ValueArrayKlass* ValueArrayKlass::allocate_klass(Klass* element_klass, ! Symbol* name, ! TRAPS) { assert(ValueArrayFlatten, "Flatten array required"); assert(ValueKlass::cast(element_klass)->is_atomic() || (!ValueArrayAtomicAccess), "Atomic by-default"); /* * MVT->LWorld, now need to allocate secondaries array types, just like objArrayKlass... * ...so now we are trying out covariant array types, just copy objArrayKlass * TODO refactor any remaining commonality */ ! // 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; ! // Also, see if the element has secondary supertypes. ! // We need an array type for each. ! Array<Klass*>* element_supers = element_klass->secondary_supers(); ! for( int i = element_supers->length()-1; i >= 0; i-- ) { ! Klass* elem_super = element_supers->at(i); ! if (elem_super->array_klass_or_null(ArrayStorageProperties::empty) == NULL) { ! supers_exist = false; ! break; ! } ! } ! if (!supers_exist) { ! // Oops. Not allocated yet. Back out, allocate it, and retry. ! Klass* ek = NULL; ! { MutexUnlocker mu(MultiArray_lock); ! super_klass = element_super->array_klass(CHECK_0); ! for( int i = element_supers->length()-1; i >= 0; i-- ) { ! Klass* elem_super = element_supers->at(i); ! elem_super->array_klass(CHECK_0); ! } ! // Now retry from the beginning ! ek = element_klass->array_klass(ArrayStorageProperties::flattened_and_null_free, 1, CHECK_0); ! } // re-lock ! return ValueArrayKlass::cast(ek); ! } ! } else { ! ShouldNotReachHere(); // Value array klass cannot be the object array klass } - } - ClassLoaderData* loader_data = element_klass->class_loader_data(); int size = ArrayKlass::static_size(ValueArrayKlass::header_size()); ValueArrayKlass* vak = new (loader_data, size, THREAD) ValueArrayKlass(element_klass, name); loader_data->add_class(vak); --- 79,110 ---- void ValueArrayKlass::set_element_klass(Klass* k) { _element_klass = k; } ! ValueArrayKlass* ValueArrayKlass::allocate_klass(Klass* element_klass, TRAPS) { assert(ValueArrayFlatten, "Flatten array required"); assert(ValueKlass::cast(element_klass)->is_atomic() || (!ValueArrayAtomicAccess), "Atomic by-default"); /* * MVT->LWorld, now need to allocate secondaries array types, just like objArrayKlass... * ...so now we are trying out covariant array types, just copy objArrayKlass * TODO refactor any remaining commonality */ ! // Eagerly allocate the direct array supertype, which would be "[L<vt>;" for this "[Q<vt>;" ! Klass* super_klass = element_klass->array_klass_or_null(ArrayStorageProperties::empty); ! if (super_klass == NULL) { MutexUnlocker mu(MultiArray_lock); ! // allocate super...need to drop the lock ! element_klass->array_klass(ArrayStorageProperties::empty, 1, CHECK_NULL); ! // retry, start from the beginning since lock dropped... ! Klass* ak = element_klass->array_klass(ArrayStorageProperties::flattened_and_null_free, 1, CHECK_NULL); ! return ValueArrayKlass::cast(ak); } + Symbol* name = ArrayKlass::create_element_klass_array_name(true, element_klass, CHECK_NULL); ClassLoaderData* loader_data = element_klass->class_loader_data(); int size = ArrayKlass::static_size(ValueArrayKlass::header_size()); ValueArrayKlass* vak = new (loader_data, size, THREAD) ValueArrayKlass(element_klass, name); loader_data->add_class(vak);
*** 143,154 **** return vak; } ValueArrayKlass* ValueArrayKlass::allocate_klass(ArrayStorageProperties storage_props, Klass* element_klass, TRAPS) { assert(storage_props.is_flattened(), "Expected flat storage"); ! Symbol* name = ArrayKlass::create_element_klass_array_name(true, element_klass, CHECK_NULL); ! return allocate_klass(element_klass, name, THREAD); } void ValueArrayKlass::initialize(TRAPS) { element_klass()->initialize(THREAD); } --- 114,124 ---- return vak; } ValueArrayKlass* ValueArrayKlass::allocate_klass(ArrayStorageProperties storage_props, Klass* element_klass, TRAPS) { assert(storage_props.is_flattened(), "Expected flat storage"); ! return allocate_klass(element_klass, THREAD); } void ValueArrayKlass::initialize(TRAPS) { element_klass()->initialize(THREAD); }
< prev index next >