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"); |