50 "array klasses must be same size as InstanceKlass");
51
52 int size = ArrayKlass::static_size(ObjArrayKlass::header_size());
53
54 return new (loader_data, size, THREAD) ObjArrayKlass(n, k, name);
55 }
56
57 Klass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data,
58 int n, Klass* element_klass, TRAPS) {
59
60 // Eagerly allocate the direct array supertype.
61 Klass* super_klass = NULL;
62 if (!Universe::is_bootstrapping() || SystemDictionary::Object_klass_loaded()) {
63 Klass* element_super = element_klass->super();
64 if (element_super != NULL) {
65 // The element type has a direct super. E.g., String[] has direct super of Object[].
66 super_klass = element_super->array_klass_or_null();
67 bool supers_exist = super_klass != NULL;
68 // Also, see if the element has secondary supertypes.
69 // We need an array type for each.
70 Array<Klass*>* element_supers = element_klass->secondary_supers();
71 for( int i = element_supers->length()-1; i >= 0; i-- ) {
72 Klass* elem_super = element_supers->at(i);
73 if (elem_super->array_klass_or_null() == NULL) {
74 supers_exist = false;
75 break;
76 }
77 }
78 if (!supers_exist) {
79 // Oops. Not allocated yet. Back out, allocate it, and retry.
80 Klass* ek = NULL;
81 {
82 MutexUnlocker mu(MultiArray_lock);
83 MutexUnlocker mc(Compile_lock); // for vtables
84 super_klass = element_super->array_klass(CHECK_0);
85 for( int i = element_supers->length()-1; i >= 0; i-- ) {
86 Klass* elem_super = element_supers->at(i);
87 elem_super->array_klass(CHECK_0);
88 }
89 // Now retry from the beginning
90 ek = element_klass->array_klass(n, CHECK_0);
365 ObjArrayKlass *ak = ObjArrayKlass::cast(higher_dimension());
366 if (or_null) {
367 return ak->array_klass_or_null(n);
368 }
369 return ak->array_klass(n, THREAD);
370 }
371
372 Klass* ObjArrayKlass::array_klass_impl(bool or_null, TRAPS) {
373 return array_klass_impl(or_null, dimension() + 1, THREAD);
374 }
375
376 bool ObjArrayKlass::can_be_primary_super_slow() const {
377 if (!bottom_klass()->can_be_primary_super())
378 // array of interfaces
379 return false;
380 else
381 return Klass::can_be_primary_super_slow();
382 }
383
384 GrowableArray<Klass*>* ObjArrayKlass::compute_secondary_supers(int num_extra_slots,
385 Array<Klass*>* transitive_interfaces) {
386 assert(transitive_interfaces == NULL, "sanity");
387 // interfaces = { cloneable_klass, serializable_klass, elemSuper[], ... };
388 Array<Klass*>* elem_supers = element_klass()->secondary_supers();
389 int num_elem_supers = elem_supers == NULL ? 0 : elem_supers->length();
390 int num_secondaries = num_extra_slots + 2 + num_elem_supers;
391 if (num_secondaries == 2) {
392 // Must share this for correct bootstrapping!
393 set_secondary_supers(Universe::the_array_interfaces_array());
394 return NULL;
395 } else {
396 GrowableArray<Klass*>* secondaries = new GrowableArray<Klass*>(num_elem_supers+2);
397 secondaries->push(SystemDictionary::Cloneable_klass());
398 secondaries->push(SystemDictionary::Serializable_klass());
399 for (int i = 0; i < num_elem_supers; i++) {
400 Klass* elem_super = (Klass*) elem_supers->at(i);
401 Klass* array_super = elem_super->array_klass_or_null();
402 assert(array_super != NULL, "must already have been created");
403 secondaries->push(array_super);
404 }
405 return secondaries;
406 }
407 }
408
409 bool ObjArrayKlass::compute_is_subtype_of(Klass* k) {
410 if (!k->is_objArray_klass())
411 return ArrayKlass::compute_is_subtype_of(k);
412
413 ObjArrayKlass* oak = ObjArrayKlass::cast(k);
414 return element_klass()->is_subtype_of(oak->element_klass());
415 }
416
417 void ObjArrayKlass::initialize(TRAPS) {
418 bottom_klass()->initialize(THREAD); // dispatches to either InstanceKlass or TypeArrayKlass
419 }
420
|
50 "array klasses must be same size as InstanceKlass");
51
52 int size = ArrayKlass::static_size(ObjArrayKlass::header_size());
53
54 return new (loader_data, size, THREAD) ObjArrayKlass(n, k, name);
55 }
56
57 Klass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data,
58 int n, Klass* element_klass, TRAPS) {
59
60 // Eagerly allocate the direct array supertype.
61 Klass* super_klass = NULL;
62 if (!Universe::is_bootstrapping() || SystemDictionary::Object_klass_loaded()) {
63 Klass* element_super = element_klass->super();
64 if (element_super != NULL) {
65 // The element type has a direct super. E.g., String[] has direct super of Object[].
66 super_klass = element_super->array_klass_or_null();
67 bool supers_exist = super_klass != NULL;
68 // Also, see if the element has secondary supertypes.
69 // We need an array type for each.
70 const Array<Klass*>* element_supers = element_klass->secondary_supers();
71 for( int i = element_supers->length()-1; i >= 0; i-- ) {
72 Klass* elem_super = element_supers->at(i);
73 if (elem_super->array_klass_or_null() == NULL) {
74 supers_exist = false;
75 break;
76 }
77 }
78 if (!supers_exist) {
79 // Oops. Not allocated yet. Back out, allocate it, and retry.
80 Klass* ek = NULL;
81 {
82 MutexUnlocker mu(MultiArray_lock);
83 MutexUnlocker mc(Compile_lock); // for vtables
84 super_klass = element_super->array_klass(CHECK_0);
85 for( int i = element_supers->length()-1; i >= 0; i-- ) {
86 Klass* elem_super = element_supers->at(i);
87 elem_super->array_klass(CHECK_0);
88 }
89 // Now retry from the beginning
90 ek = element_klass->array_klass(n, CHECK_0);
365 ObjArrayKlass *ak = ObjArrayKlass::cast(higher_dimension());
366 if (or_null) {
367 return ak->array_klass_or_null(n);
368 }
369 return ak->array_klass(n, THREAD);
370 }
371
372 Klass* ObjArrayKlass::array_klass_impl(bool or_null, TRAPS) {
373 return array_klass_impl(or_null, dimension() + 1, THREAD);
374 }
375
376 bool ObjArrayKlass::can_be_primary_super_slow() const {
377 if (!bottom_klass()->can_be_primary_super())
378 // array of interfaces
379 return false;
380 else
381 return Klass::can_be_primary_super_slow();
382 }
383
384 GrowableArray<Klass*>* ObjArrayKlass::compute_secondary_supers(int num_extra_slots,
385 Array<InstanceKlass*>* transitive_interfaces) {
386 assert(transitive_interfaces == NULL, "sanity");
387 // interfaces = { cloneable_klass, serializable_klass, elemSuper[], ... };
388 const Array<Klass*>* elem_supers = element_klass()->secondary_supers();
389 int num_elem_supers = elem_supers == NULL ? 0 : elem_supers->length();
390 int num_secondaries = num_extra_slots + 2 + num_elem_supers;
391 if (num_secondaries == 2) {
392 // Must share this for correct bootstrapping!
393 set_secondary_supers(Universe::the_array_interfaces_array());
394 return NULL;
395 } else {
396 GrowableArray<Klass*>* secondaries = new GrowableArray<Klass*>(num_elem_supers+2);
397 secondaries->push(SystemDictionary::Cloneable_klass());
398 secondaries->push(SystemDictionary::Serializable_klass());
399 for (int i = 0; i < num_elem_supers; i++) {
400 Klass* elem_super = elem_supers->at(i);
401 Klass* array_super = elem_super->array_klass_or_null();
402 assert(array_super != NULL, "must already have been created");
403 secondaries->push(array_super);
404 }
405 return secondaries;
406 }
407 }
408
409 bool ObjArrayKlass::compute_is_subtype_of(Klass* k) {
410 if (!k->is_objArray_klass())
411 return ArrayKlass::compute_is_subtype_of(k);
412
413 ObjArrayKlass* oak = ObjArrayKlass::cast(k);
414 return element_klass()->is_subtype_of(oak->element_klass());
415 }
416
417 void ObjArrayKlass::initialize(TRAPS) {
418 bottom_klass()->initialize(THREAD); // dispatches to either InstanceKlass or TypeArrayKlass
419 }
420
|