hotspot/src/share/vm/oops/instanceKlassKlass.cpp
changeset 12369 48fd3da4025c
parent 12231 6a9cfc59a18a
child 12587 8f819769ca1b
equal deleted inserted replaced
12234:f3187578ddd3 12369:48fd3da4025c
     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");