comparison src/share/vm/oops/instanceKlassKlass.cpp @ 5998:49036505ab5f

7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass. Summary: Change implementor to embedded instanceKlass field. Reviewed-by: sspitsyn, minqi, coleenp
author jiangli
date Thu, 29 Mar 2012 22:18:56 -0400
parents f7c4174b33ba
children 8bafad97cd26
comparison
equal deleted inserted replaced
5970:0698f5ef5535 5998:49036505ab5f
1 /* 1 /*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
109 MarkSweep::mark_and_push(ik->adr_fields_annotations()); 109 MarkSweep::mark_and_push(ik->adr_fields_annotations());
110 MarkSweep::mark_and_push(ik->adr_methods_annotations()); 110 MarkSweep::mark_and_push(ik->adr_methods_annotations());
111 MarkSweep::mark_and_push(ik->adr_methods_parameter_annotations()); 111 MarkSweep::mark_and_push(ik->adr_methods_parameter_annotations());
112 MarkSweep::mark_and_push(ik->adr_methods_default_annotations()); 112 MarkSweep::mark_and_push(ik->adr_methods_default_annotations());
113 113
114 // We do not follow adr_implementors() here. It is followed later 114 // We do not follow adr_implementor() here. It is followed later
115 // in instanceKlass::follow_weak_klass_links() 115 // in instanceKlass::follow_weak_klass_links()
116 116
117 klassKlass::oop_follow_contents(obj); 117 klassKlass::oop_follow_contents(obj);
118 118
119 iterate_c_heap_oops(ik, &MarkSweep::mark_and_push_closure); 119 iterate_c_heap_oops(ik, &MarkSweep::mark_and_push_closure);
178 blk->do_oop(ik->adr_class_loader()); 178 blk->do_oop(ik->adr_class_loader());
179 blk->do_oop(ik->adr_protection_domain()); 179 blk->do_oop(ik->adr_protection_domain());
180 blk->do_oop(ik->adr_host_klass()); 180 blk->do_oop(ik->adr_host_klass());
181 blk->do_oop(ik->adr_signers()); 181 blk->do_oop(ik->adr_signers());
182 blk->do_oop(ik->adr_inner_classes()); 182 blk->do_oop(ik->adr_inner_classes());
183 for (int i = 0; i < instanceKlass::implementors_limit; i++) { 183 if (ik->is_interface()) {
184 blk->do_oop(&ik->adr_implementors()[i]); 184 blk->do_oop(ik->adr_implementor());
185 } 185 }
186 blk->do_oop(ik->adr_class_annotations()); 186 blk->do_oop(ik->adr_class_annotations());
187 blk->do_oop(ik->adr_fields_annotations()); 187 blk->do_oop(ik->adr_fields_annotations());
188 blk->do_oop(ik->adr_methods_annotations()); 188 blk->do_oop(ik->adr_methods_annotations());
189 blk->do_oop(ik->adr_methods_parameter_annotations()); 189 blk->do_oop(ik->adr_methods_parameter_annotations());
230 if (mr.contains(adr)) blk->do_oop(adr); 230 if (mr.contains(adr)) blk->do_oop(adr);
231 adr = ik->adr_signers(); 231 adr = ik->adr_signers();
232 if (mr.contains(adr)) blk->do_oop(adr); 232 if (mr.contains(adr)) blk->do_oop(adr);
233 adr = ik->adr_inner_classes(); 233 adr = ik->adr_inner_classes();
234 if (mr.contains(adr)) blk->do_oop(adr); 234 if (mr.contains(adr)) blk->do_oop(adr);
235 adr = ik->adr_implementors(); 235 if (ik->is_interface()) {
236 for (int i = 0; i < instanceKlass::implementors_limit; i++) { 236 adr = ik->adr_implementor();
237 if (mr.contains(&adr[i])) blk->do_oop(&adr[i]); 237 if (mr.contains(adr)) blk->do_oop(adr);
238 } 238 }
239 adr = ik->adr_class_annotations(); 239 adr = ik->adr_class_annotations();
240 if (mr.contains(adr)) blk->do_oop(adr); 240 if (mr.contains(adr)) blk->do_oop(adr);
241 adr = ik->adr_fields_annotations(); 241 adr = ik->adr_fields_annotations();
242 if (mr.contains(adr)) blk->do_oop(adr); 242 if (mr.contains(adr)) blk->do_oop(adr);
271 MarkSweep::adjust_pointer(ik->adr_class_loader()); 271 MarkSweep::adjust_pointer(ik->adr_class_loader());
272 MarkSweep::adjust_pointer(ik->adr_protection_domain()); 272 MarkSweep::adjust_pointer(ik->adr_protection_domain());
273 MarkSweep::adjust_pointer(ik->adr_host_klass()); 273 MarkSweep::adjust_pointer(ik->adr_host_klass());
274 MarkSweep::adjust_pointer(ik->adr_signers()); 274 MarkSweep::adjust_pointer(ik->adr_signers());
275 MarkSweep::adjust_pointer(ik->adr_inner_classes()); 275 MarkSweep::adjust_pointer(ik->adr_inner_classes());
276 for (int i = 0; i < instanceKlass::implementors_limit; i++) { 276 if (ik->is_interface()) {
277 MarkSweep::adjust_pointer(&ik->adr_implementors()[i]); 277 MarkSweep::adjust_pointer(ik->adr_implementor());
278 } 278 }
279 MarkSweep::adjust_pointer(ik->adr_class_annotations()); 279 MarkSweep::adjust_pointer(ik->adr_class_annotations());
280 MarkSweep::adjust_pointer(ik->adr_fields_annotations()); 280 MarkSweep::adjust_pointer(ik->adr_fields_annotations());
281 MarkSweep::adjust_pointer(ik->adr_methods_annotations()); 281 MarkSweep::adjust_pointer(ik->adr_methods_annotations());
282 MarkSweep::adjust_pointer(ik->adr_methods_parameter_annotations()); 282 MarkSweep::adjust_pointer(ik->adr_methods_parameter_annotations());
326 oop* const beg_oop = ik->oop_block_beg(); 326 oop* const beg_oop = ik->oop_block_beg();
327 oop* const end_oop = ik->oop_block_end(); 327 oop* const end_oop = ik->oop_block_end();
328 for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) { 328 for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) {
329 PSParallelCompact::adjust_pointer(cur_oop); 329 PSParallelCompact::adjust_pointer(cur_oop);
330 } 330 }
331 if (ik->is_interface()) {
332 PSParallelCompact::adjust_pointer(ik->adr_implementor());
333 }
331 334
332 OopClosure* closure = PSParallelCompact::adjust_root_pointer_closure(); 335 OopClosure* closure = PSParallelCompact::adjust_root_pointer_closure();
333 iterate_c_heap_oops(ik, closure); 336 iterate_c_heap_oops(ik, closure);
334 337
335 klassKlass::oop_update_pointers(cm, obj); 338 klassKlass::oop_update_pointers(cm, obj);
340 343
341 klassOop 344 klassOop
342 instanceKlassKlass::allocate_instance_klass(Symbol* name, int vtable_len, int itable_len, 345 instanceKlassKlass::allocate_instance_klass(Symbol* name, int vtable_len, int itable_len,
343 int static_field_size, 346 int static_field_size,
344 unsigned nonstatic_oop_map_count, 347 unsigned nonstatic_oop_map_count,
348 AccessFlags access_flags,
345 ReferenceType rt, TRAPS) { 349 ReferenceType rt, TRAPS) {
346 350
347 const int nonstatic_oop_map_size = 351 const int nonstatic_oop_map_size =
348 instanceKlass::nonstatic_oop_map_size(nonstatic_oop_map_count); 352 instanceKlass::nonstatic_oop_map_size(nonstatic_oop_map_count);
349 int size = instanceKlass::object_size(align_object_offset(vtable_len) + align_object_offset(itable_len) + nonstatic_oop_map_size); 353 int size = align_object_offset(vtable_len) + align_object_offset(itable_len);
354 if (access_flags.is_interface()) {
355 size += align_object_offset(nonstatic_oop_map_size) + (int)sizeof(klassOop)/HeapWordSize;
356 } else {
357 size += nonstatic_oop_map_size;
358 }
359 size = instanceKlass::object_size(size);
350 360
351 // Allocation 361 // Allocation
352 KlassHandle h_this_klass(THREAD, as_klassOop()); 362 KlassHandle h_this_klass(THREAD, as_klassOop());
353 KlassHandle k; 363 KlassHandle k;
354 if (rt == REF_NONE) { 364 if (rt == REF_NONE) {
376 // sizes before the first GC, i.e., when we allocate the mirror. 386 // sizes before the first GC, i.e., when we allocate the mirror.
377 ik->set_vtable_length(vtable_len); 387 ik->set_vtable_length(vtable_len);
378 ik->set_itable_length(itable_len); 388 ik->set_itable_length(itable_len);
379 ik->set_static_field_size(static_field_size); 389 ik->set_static_field_size(static_field_size);
380 ik->set_nonstatic_oop_map_size(nonstatic_oop_map_size); 390 ik->set_nonstatic_oop_map_size(nonstatic_oop_map_size);
391 ik->set_access_flags(access_flags);
381 assert(k()->size() == size, "wrong size for object"); 392 assert(k()->size() == size, "wrong size for object");
382 393
383 ik->set_array_klasses(NULL); 394 ik->set_array_klasses(NULL);
384 ik->set_methods(NULL); 395 ik->set_methods(NULL);
385 ik->set_method_ordering(NULL); 396 ik->set_method_ordering(NULL);
468 if (n >= MaxSubklassPrintSize) st->print("(%d more klasses...)", n - MaxSubklassPrintSize); 479 if (n >= MaxSubklassPrintSize) st->print("(%d more klasses...)", n - MaxSubklassPrintSize);
469 st->cr(); 480 st->cr();
470 481
471 if (ik->is_interface()) { 482 if (ik->is_interface()) {
472 st->print_cr(BULLET"nof implementors: %d", ik->nof_implementors()); 483 st->print_cr(BULLET"nof implementors: %d", ik->nof_implementors());
473 int print_impl = 0; 484 if (ik->nof_implementors() == 1) {
474 for (int i = 0; i < instanceKlass::implementors_limit; i++) { 485 st->print_cr(BULLET"implementor: ");
475 if (ik->implementor(i) != NULL) { 486 st->print(" ");
476 if (++print_impl == 1) 487 ik->implementor()->print_value_on(st);
477 st->print_cr(BULLET"implementor: "); 488 st->cr();
478 st->print(" "); 489 }
479 ik->implementor(i)->print_value_on(st);
480 }
481 }
482 if (print_impl > 0) st->cr();
483 } 490 }
484 491
485 st->print(BULLET"arrays: "); ik->array_klasses()->print_value_on(st); st->cr(); 492 st->print(BULLET"arrays: "); ik->array_klasses()->print_value_on(st); st->cr();
486 st->print(BULLET"methods: "); ik->methods()->print_value_on(st); st->cr(); 493 st->print(BULLET"methods: "); ik->methods()->print_value_on(st); st->cr();
487 if (Verbose) { 494 if (Verbose) {
638 guarantee(sib->super() == super, "siblings should have same superklass"); 645 guarantee(sib->super() == super, "siblings should have same superklass");
639 sib = sib->next_sibling(); 646 sib = sib->next_sibling();
640 } 647 }
641 648
642 // Verify implementor fields 649 // Verify implementor fields
643 bool saw_null_impl = false; 650 klassOop im = ik->implementor();
644 for (int i = 0; i < instanceKlass::implementors_limit; i++) { 651 if (im != NULL) {
645 klassOop im = ik->implementor(i);
646 if (im == NULL) { saw_null_impl = true; continue; }
647 guarantee(!saw_null_impl, "non-nulls must preceded all nulls");
648 guarantee(ik->is_interface(), "only interfaces should have implementor set"); 652 guarantee(ik->is_interface(), "only interfaces should have implementor set");
649 guarantee(i < ik->nof_implementors(), "should only have one implementor");
650 guarantee(im->is_perm(), "should be in permspace"); 653 guarantee(im->is_perm(), "should be in permspace");
651 guarantee(im->is_klass(), "should be klass"); 654 guarantee(im->is_klass(), "should be klass");
652 guarantee(!Klass::cast(klassOop(im))->is_interface(), "implementors cannot be interfaces"); 655 guarantee(!Klass::cast(klassOop(im))->is_interface() || im == ik->as_klassOop(), "implementors cannot be interfaces");
653 } 656 }
654 657
655 // Verify local interfaces 658 // Verify local interfaces
656 objArrayOop local_interfaces = ik->local_interfaces(); 659 objArrayOop local_interfaces = ik->local_interfaces();
657 guarantee(local_interfaces->is_perm(), "should be in permspace"); 660 guarantee(local_interfaces->is_perm(), "should be in permspace");