< prev index next >
src/hotspot/share/oops/valueArrayKlass.cpp
Print this page
@@ -79,61 +79,32 @@
void ValueArrayKlass::set_element_klass(Klass* k) {
_element_klass = k;
}
-ValueArrayKlass* ValueArrayKlass::allocate_klass(Klass* element_klass,
- Symbol* name,
- TRAPS) {
+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.
- 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;
- {
+ // 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);
- 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
+ // 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,12 +114,11 @@
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);
+ return allocate_klass(element_klass, THREAD);
}
void ValueArrayKlass::initialize(TRAPS) {
element_klass()->initialize(THREAD);
}
< prev index next >