src/share/vm/oops/objArrayKlass.cpp

changeset 4280
80e866b1d053
parent 4278
070d523b96a7
child 4304
90273fc0a981
equal deleted inserted replaced
4269:6b6ddf8c4329 4280:80e866b1d053
79 // Also, see if the element has secondary supertypes. 79 // Also, see if the element has secondary supertypes.
80 // We need an array type for each. 80 // We need an array type for each.
81 Array<Klass*>* element_supers = element_klass->secondary_supers(); 81 Array<Klass*>* element_supers = element_klass->secondary_supers();
82 for( int i = element_supers->length()-1; i >= 0; i-- ) { 82 for( int i = element_supers->length()-1; i >= 0; i-- ) {
83 Klass* elem_super = element_supers->at(i); 83 Klass* elem_super = element_supers->at(i);
84 if (Klass::cast(elem_super)->array_klass_or_null() == NULL) { 84 if (elem_super->array_klass_or_null() == NULL) {
85 supers_exist = false; 85 supers_exist = false;
86 break; 86 break;
87 } 87 }
88 } 88 }
89 if (!supers_exist) { 89 if (!supers_exist) {
170 if (element_klass->oop_is_objArray()) { 170 if (element_klass->oop_is_objArray()) {
171 bk = ObjArrayKlass::cast(element_klass())->bottom_klass(); 171 bk = ObjArrayKlass::cast(element_klass())->bottom_klass();
172 } else { 172 } else {
173 bk = element_klass(); 173 bk = element_klass();
174 } 174 }
175 assert(bk != NULL && (Klass::cast(bk)->oop_is_instance() || Klass::cast(bk)->oop_is_typeArray()), "invalid bottom klass"); 175 assert(bk != NULL && (bk->oop_is_instance() || bk->oop_is_typeArray()), "invalid bottom klass");
176 this->set_bottom_klass(bk); 176 this->set_bottom_klass(bk);
177 this->set_class_loader_data(bk->class_loader_data()); 177 this->set_class_loader_data(bk->class_loader_data());
178 178
179 this->set_layout_helper(array_layout_helper(T_OBJECT)); 179 this->set_layout_helper(array_layout_helper(T_OBJECT));
180 assert(this->oop_is_array(), "sanity"); 180 assert(this->oop_is_array(), "sanity");
252 Copy::conjoint_oops_atomic(src, dst, length); 252 Copy::conjoint_oops_atomic(src, dst, length);
253 } else { 253 } else {
254 // We have to make sure all elements conform to the destination array 254 // We have to make sure all elements conform to the destination array
255 Klass* bound = ObjArrayKlass::cast(d->klass())->element_klass(); 255 Klass* bound = ObjArrayKlass::cast(d->klass())->element_klass();
256 Klass* stype = ObjArrayKlass::cast(s->klass())->element_klass(); 256 Klass* stype = ObjArrayKlass::cast(s->klass())->element_klass();
257 if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) { 257 if (stype == bound || stype->is_subtype_of(bound)) {
258 // elements are guaranteed to be subtypes, so no check necessary 258 // elements are guaranteed to be subtypes, so no check necessary
259 bs->write_ref_array_pre(dst, length); 259 bs->write_ref_array_pre(dst, length);
260 Copy::conjoint_oops_atomic(src, dst, length); 260 Copy::conjoint_oops_atomic(src, dst, length);
261 } else { 261 } else {
262 // slow case: need individual subtype checks 262 // slow case: need individual subtype checks
269 // even slower now 269 // even slower now
270 bool element_is_null = oopDesc::is_null(element); 270 bool element_is_null = oopDesc::is_null(element);
271 oop new_val = element_is_null ? oop(NULL) 271 oop new_val = element_is_null ? oop(NULL)
272 : oopDesc::decode_heap_oop_not_null(element); 272 : oopDesc::decode_heap_oop_not_null(element);
273 if (element_is_null || 273 if (element_is_null ||
274 Klass::cast((new_val->klass()))->is_subtype_of(bound)) { 274 (new_val->klass())->is_subtype_of(bound)) {
275 bs->write_ref_field_pre(p, new_val); 275 bs->write_ref_field_pre(p, new_val);
276 *p = *from; 276 *p = *from;
277 } else { 277 } else {
278 // We must do a barrier to cover the partial copy. 278 // We must do a barrier to cover the partial copy.
279 const size_t pd = pointer_delta(p, dst, (size_t)heapOopSize); 279 const size_t pd = pointer_delta(p, dst, (size_t)heapOopSize);
379 return Klass::can_be_primary_super_slow(); 379 return Klass::can_be_primary_super_slow();
380 } 380 }
381 381
382 GrowableArray<Klass*>* ObjArrayKlass::compute_secondary_supers(int num_extra_slots) { 382 GrowableArray<Klass*>* ObjArrayKlass::compute_secondary_supers(int num_extra_slots) {
383 // interfaces = { cloneable_klass, serializable_klass, elemSuper[], ... }; 383 // interfaces = { cloneable_klass, serializable_klass, elemSuper[], ... };
384 Array<Klass*>* elem_supers = Klass::cast(element_klass())->secondary_supers(); 384 Array<Klass*>* elem_supers = element_klass()->secondary_supers();
385 int num_elem_supers = elem_supers == NULL ? 0 : elem_supers->length(); 385 int num_elem_supers = elem_supers == NULL ? 0 : elem_supers->length();
386 int num_secondaries = num_extra_slots + 2 + num_elem_supers; 386 int num_secondaries = num_extra_slots + 2 + num_elem_supers;
387 if (num_secondaries == 2) { 387 if (num_secondaries == 2) {
388 // Must share this for correct bootstrapping! 388 // Must share this for correct bootstrapping!
389 set_secondary_supers(Universe::the_array_interfaces_array()); 389 set_secondary_supers(Universe::the_array_interfaces_array());
409 ObjArrayKlass* oak = ObjArrayKlass::cast(k); 409 ObjArrayKlass* oak = ObjArrayKlass::cast(k);
410 return element_klass()->is_subtype_of(oak->element_klass()); 410 return element_klass()->is_subtype_of(oak->element_klass());
411 } 411 }
412 412
413 void ObjArrayKlass::initialize(TRAPS) { 413 void ObjArrayKlass::initialize(TRAPS) {
414 Klass::cast(bottom_klass())->initialize(THREAD); // dispatches to either InstanceKlass or TypeArrayKlass 414 bottom_klass()->initialize(THREAD); // dispatches to either InstanceKlass or TypeArrayKlass
415 } 415 }
416 416
417 #define ObjArrayKlass_SPECIALIZED_OOP_ITERATE(T, a, p, do_oop) \ 417 #define ObjArrayKlass_SPECIALIZED_OOP_ITERATE(T, a, p, do_oop) \
418 { \ 418 { \
419 T* p = (T*)(a)->base(); \ 419 T* p = (T*)(a)->base(); \
605 if (element_klass() == NULL) { 605 if (element_klass() == NULL) {
606 assert(Universe::is_bootstrapping(), "partial objArray only at startup"); 606 assert(Universe::is_bootstrapping(), "partial objArray only at startup");
607 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; 607 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
608 } 608 }
609 // Return the flags of the bottom element type. 609 // Return the flags of the bottom element type.
610 jint element_flags = Klass::cast(bottom_klass())->compute_modifier_flags(CHECK_0); 610 jint element_flags = bottom_klass()->compute_modifier_flags(CHECK_0);
611 611
612 return (element_flags & (JVM_ACC_PUBLIC | JVM_ACC_PRIVATE | JVM_ACC_PROTECTED)) 612 return (element_flags & (JVM_ACC_PUBLIC | JVM_ACC_PRIVATE | JVM_ACC_PROTECTED))
613 | (JVM_ACC_ABSTRACT | JVM_ACC_FINAL); 613 | (JVM_ACC_ABSTRACT | JVM_ACC_FINAL);
614 } 614 }
615 615
684 ArrayKlass::verify_on(st); 684 ArrayKlass::verify_on(st);
685 guarantee(element_klass()->is_metadata(), "should be in metaspace"); 685 guarantee(element_klass()->is_metadata(), "should be in metaspace");
686 guarantee(element_klass()->is_klass(), "should be klass"); 686 guarantee(element_klass()->is_klass(), "should be klass");
687 guarantee(bottom_klass()->is_metadata(), "should be in metaspace"); 687 guarantee(bottom_klass()->is_metadata(), "should be in metaspace");
688 guarantee(bottom_klass()->is_klass(), "should be klass"); 688 guarantee(bottom_klass()->is_klass(), "should be klass");
689 Klass* bk = Klass::cast(bottom_klass()); 689 Klass* bk = bottom_klass();
690 guarantee(bk->oop_is_instance() || bk->oop_is_typeArray(), "invalid bottom klass"); 690 guarantee(bk->oop_is_instance() || bk->oop_is_typeArray(), "invalid bottom klass");
691 } 691 }
692 692
693 void ObjArrayKlass::oop_verify_on(oop obj, outputStream* st) { 693 void ObjArrayKlass::oop_verify_on(oop obj, outputStream* st) {
694 ArrayKlass::oop_verify_on(obj, st); 694 ArrayKlass::oop_verify_on(obj, st);

mercurial