src/share/vm/oops/klassVtable.cpp

Fri, 20 Mar 2009 23:19:36 -0700

author
jrose
date
Fri, 20 Mar 2009 23:19:36 -0700
changeset 1100
c89f86385056
parent 1045
70998f2e05ef
child 1111
d3676b4cb78c
permissions
-rw-r--r--

6814659: separable cleanups and subroutines for 6655638
Summary: preparatory but separable changes for method handles
Reviewed-by: kvn, never

     1 /*
     2  * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     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
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 #include "incls/_precompiled.incl"
    26 #include "incls/_klassVtable.cpp.incl"
    28 inline instanceKlass* klassVtable::ik() const {
    29   Klass* k = _klass()->klass_part();
    30   assert(k->oop_is_instance(), "not an instanceKlass");
    31   return (instanceKlass*)k;
    32 }
    35 // this function computes the vtable size (including the size needed for miranda
    36 // methods) and the number of miranda methods in this class
    37 // Note on Miranda methods: Let's say there is a class C that implements
    38 // interface I.  Let's say there is a method m in I that neither C nor any
    39 // of its super classes implement (i.e there is no method of any access, with
    40 // the same name and signature as m), then m is a Miranda method which is
    41 // entered as a public abstract method in C's vtable.  From then on it should
    42 // treated as any other public method in C for method over-ride purposes.
    43 void klassVtable::compute_vtable_size_and_num_mirandas(int &vtable_length,
    44                                                        int &num_miranda_methods,
    45                                                        klassOop super,
    46                                                        objArrayOop methods,
    47                                                        AccessFlags class_flags,
    48                                                        oop classloader,
    49                                                        symbolOop classname,
    50                                                        objArrayOop local_interfaces
    51                                                        ) {
    53   No_Safepoint_Verifier nsv;
    55   // set up default result values
    56   vtable_length = 0;
    57   num_miranda_methods = 0;
    59   // start off with super's vtable length
    60   instanceKlass* sk = (instanceKlass*)super->klass_part();
    61   vtable_length = super == NULL ? 0 : sk->vtable_length();
    63   // go thru each method in the methods table to see if it needs a new entry
    64   int len = methods->length();
    65   for (int i = 0; i < len; i++) {
    66     assert(methods->obj_at(i)->is_method(), "must be a methodOop");
    67     methodOop m = methodOop(methods->obj_at(i));
    69     if (needs_new_vtable_entry(m, super, classloader, classname, class_flags)) {
    70       vtable_length += vtableEntry::size(); // we need a new entry
    71     }
    72   }
    74   // compute the number of mirandas methods that must be added to the end
    75   num_miranda_methods = get_num_mirandas(super, methods, local_interfaces);
    76   vtable_length += (num_miranda_methods * vtableEntry::size());
    78   if (Universe::is_bootstrapping() && vtable_length == 0) {
    79     // array classes don't have their superclass set correctly during
    80     // bootstrapping
    81     vtable_length = Universe::base_vtable_size();
    82   }
    84   if (super == NULL && !Universe::is_bootstrapping() &&
    85       vtable_length != Universe::base_vtable_size()) {
    86     // Someone is attempting to redefine java.lang.Object incorrectly.  The
    87     // only way this should happen is from
    88     // SystemDictionary::resolve_from_stream(), which will detect this later
    89     // and throw a security exception.  So don't assert here to let
    90     // the exception occur.
    91     vtable_length = Universe::base_vtable_size();
    92   }
    93   assert(super != NULL || vtable_length == Universe::base_vtable_size(),
    94          "bad vtable size for class Object");
    95   assert(vtable_length % vtableEntry::size() == 0, "bad vtable length");
    96   assert(vtable_length >= Universe::base_vtable_size(), "vtable too small");
    97 }
    99 int klassVtable::index_of(methodOop m, int len) const {
   100   assert(m->vtable_index() >= 0, "do not ask this of non-vtable methods");
   101   return m->vtable_index();
   102 }
   104 int klassVtable::initialize_from_super(KlassHandle super) {
   105   if (super.is_null()) {
   106     return 0;
   107   } else {
   108     // copy methods from superKlass
   109     // can't inherit from array class, so must be instanceKlass
   110     assert(super->oop_is_instance(), "must be instance klass");
   111     instanceKlass* sk = (instanceKlass*)super()->klass_part();
   112     klassVtable* superVtable = sk->vtable();
   113     assert(superVtable->length() <= _length, "vtable too short");
   114 #ifdef ASSERT
   115     superVtable->verify(tty, true);
   116 #endif
   117     superVtable->copy_vtable_to(table());
   118 #ifndef PRODUCT
   119     if (PrintVtables && Verbose) {
   120       tty->print_cr("copy vtable from %s to %s size %d", sk->internal_name(), klass()->internal_name(), _length);
   121     }
   122 #endif
   123     return superVtable->length();
   124   }
   125 }
   127 // Revised lookup semantics   introduced 1.3 (Kestral beta)
   128 void klassVtable::initialize_vtable(bool checkconstraints, TRAPS) {
   130   // Note:  Arrays can have intermediate array supers.  Use java_super to skip them.
   131   KlassHandle super (THREAD, klass()->java_super());
   132   int nofNewEntries = 0;
   135   if (PrintVtables && !klass()->oop_is_array()) {
   136     ResourceMark rm(THREAD);
   137     tty->print_cr("Initializing: %s", _klass->name()->as_C_string());
   138   }
   140 #ifdef ASSERT
   141   oop* end_of_obj = (oop*)_klass() + _klass()->size();
   142   oop* end_of_vtable = (oop*)&table()[_length];
   143   assert(end_of_vtable <= end_of_obj, "vtable extends beyond end");
   144 #endif
   146   if (Universe::is_bootstrapping()) {
   147     // just clear everything
   148     for (int i = 0; i < _length; i++) table()[i].clear();
   149     return;
   150   }
   152   int super_vtable_len = initialize_from_super(super);
   153   if (klass()->oop_is_array()) {
   154     assert(super_vtable_len == _length, "arrays shouldn't introduce new methods");
   155   } else {
   156     assert(_klass->oop_is_instance(), "must be instanceKlass");
   158     objArrayHandle methods(THREAD, ik()->methods());
   159     int len = methods()->length();
   160     int initialized = super_vtable_len;
   162     // update_super_vtable can stop for gc - ensure using handles
   163     for (int i = 0; i < len; i++) {
   164       HandleMark hm(THREAD);
   165       assert(methods()->obj_at(i)->is_method(), "must be a methodOop");
   166       methodHandle mh(THREAD, (methodOop)methods()->obj_at(i));
   168       bool needs_new_entry = update_super_vtable(ik(), mh, super_vtable_len, checkconstraints, CHECK);
   170       if (needs_new_entry) {
   171         put_method_at(mh(), initialized);
   172         mh()->set_vtable_index(initialized); // set primary vtable index
   173         initialized++;
   174       }
   175     }
   177     // add miranda methods; it will also update the value of initialized
   178     fill_in_mirandas(initialized);
   180     // In class hierachieswhere the accesibility is not increasing (i.e., going from private ->
   181     // package_private -> publicprotected), the vtable might actually be smaller than our initial
   182     // calculation.
   183     assert(initialized <= _length, "vtable initialization failed");
   184     for(;initialized < _length; initialized++) {
   185       put_method_at(NULL, initialized);
   186     }
   187     NOT_PRODUCT(verify(tty, true));
   188   }
   189 }
   191 // Interates through the vtables to find the broadest access level. This
   192 // will always be monotomic for valid Java programs - but not neccesarily
   193 // for incompatible class files.
   194 klassVtable::AccessType klassVtable::vtable_accessibility_at(int i) {
   195   // This vtable is not implementing the specific method
   196   if (i >= length()) return acc_private;
   198   // Compute AccessType for current method. public or protected we are done.
   199   methodOop m = method_at(i);
   200   if (m->is_protected() || m->is_public()) return acc_publicprotected;
   202   AccessType acc = m->is_package_private() ? acc_package_private : acc_private;
   204   // Compute AccessType for method in super classes
   205   klassOop super = klass()->super();
   206   AccessType super_acc = (super != NULL) ? instanceKlass::cast(klass()->super())->vtable()->vtable_accessibility_at(i)
   207                                          : acc_private;
   209   // Merge
   210   return (AccessType)MAX2((int)acc, (int)super_acc);
   211 }
   214 // Update child's copy of super vtable for overrides
   215 // OR return true if a new vtable entry is required
   216 // Only called for instanceKlass's, i.e. not for arrays
   217 // If that changed, could not use _klass as handle for klass
   218 bool klassVtable::update_super_vtable(instanceKlass* klass, methodHandle target_method, int super_vtable_len, bool checkconstraints, TRAPS) {
   219   ResourceMark rm;
   220   bool allocate_new = true;
   221   assert(klass->oop_is_instance(), "must be instanceKlass");
   223   // Initialize the method's vtable index to "nonvirtual".
   224   // If we allocate a vtable entry, we will update it to a non-negative number.
   225   target_method()->set_vtable_index(methodOopDesc::nonvirtual_vtable_index);
   227   // Static and <init> methods are never in
   228   if (target_method()->is_static() || target_method()->name() ==  vmSymbols::object_initializer_name()) {
   229     return false;
   230   }
   232   if (klass->is_final() || target_method()->is_final()) {
   233     // a final method never needs a new entry; final methods can be statically
   234     // resolved and they have to be present in the vtable only if they override
   235     // a super's method, in which case they re-use its entry
   236     allocate_new = false;
   237   }
   239   // we need a new entry if there is no superclass
   240   if (klass->super() == NULL) {
   241     return allocate_new;
   242   }
   244   // private methods always have a new entry in the vtable
   245   if (target_method()->is_private()) {
   246     return allocate_new;
   247   }
   249   // search through the vtable and update overridden entries
   250   // Since check_signature_loaders acquires SystemDictionary_lock
   251   // which can block for gc, once we are in this loop, use handles, not
   252   // unhandled oops unless they are reinitialized for each loop
   253   // handles for name, signature, klass, target_method
   254   // not for match_method, holder
   256   symbolHandle name(THREAD,target_method()->name());
   257   symbolHandle signature(THREAD,target_method()->signature());
   258   for(int i = 0; i < super_vtable_len; i++) {
   259     methodOop match_method = method_at(i);
   260     // Check if method name matches
   261     if (match_method->name() == name() && match_method->signature() == signature()) {
   263       instanceKlass* holder = (THREAD, instanceKlass::cast(match_method->method_holder()));
   265       // Check if the match_method is accessable from current class
   267       bool same_package_init = false;
   268       bool same_package_flag = false;
   269       bool simple_match = match_method->is_public()  || match_method->is_protected();
   270       if (!simple_match) {
   271         same_package_init = true;
   272         same_package_flag = holder->is_same_class_package(_klass->class_loader(), _klass->name());
   274         simple_match = match_method->is_package_private() && same_package_flag;
   275       }
   276       // match_method is the superclass' method. Note we can't override
   277       // and shouldn't access superclass' ACC_PRIVATE methods
   278       // (although they have been copied into our vtable)
   279       // A simple form of this statement is:
   280       // if ( (match_method->is_public()  || match_method->is_protected()) ||
   281       //    (match_method->is_package_private() && holder->is_same_class_package(klass->class_loader(), klass->name()))) {
   282       //
   283       // The complexity is introduced it avoid recomputing 'is_same_class_package' which is expensive.
   284       if (simple_match) {
   285         // Check if target_method and match_method has same level of accessibility. The accesibility of the
   286         // match method is the "most-general" visibility of all entries at it's particular vtable index for
   287         // all superclasses. This check must be done before we override the current entry in the vtable.
   288         AccessType at = vtable_accessibility_at(i);
   289         bool same_access = false;
   291         if (  (at == acc_publicprotected && (target_method()->is_public() || target_method()->is_protected())
   292            || (at == acc_package_private && (target_method()->is_package_private() &&
   293                                             (( same_package_init && same_package_flag) ||
   294                                              (!same_package_init && holder->is_same_class_package(_klass->class_loader(), _klass->name()))))))) {
   295            same_access = true;
   296         }
   298         if (checkconstraints) {
   299         // Override vtable entry if passes loader constraint check
   300         // if loader constraint checking requested
   301         // No need to visit his super, since he and his super
   302         // have already made any needed loader constraints.
   303         // Since loader constraints are transitive, it is enough
   304         // to link to the first super, and we get all the others.
   305           symbolHandle signature(THREAD, target_method()->signature());
   306           Handle this_loader(THREAD, _klass->class_loader());
   307           instanceKlassHandle super_klass(THREAD, _klass->super());
   308           Handle super_loader(THREAD, super_klass->class_loader());
   310           if (this_loader() != super_loader()) {
   311             ResourceMark rm(THREAD);
   312             char* failed_type_name =
   313               SystemDictionary::check_signature_loaders(signature, this_loader,
   314                                                         super_loader, true,
   315                                                         CHECK_(false));
   316             if (failed_type_name != NULL) {
   317               const char* msg = "loader constraint violation: when resolving "
   318                 "overridden method \"%s\" the class loader (instance"
   319                 " of %s) of the current class, %s, and its superclass loader "
   320                 "(instance of %s), have different Class objects for the type "
   321                 "%s used in the signature";
   322               char* sig = target_method()->name_and_sig_as_C_string();
   323               const char* loader1 = SystemDictionary::loader_name(this_loader());
   324               char* current = _klass->name()->as_C_string();
   325               const char* loader2 = SystemDictionary::loader_name(super_loader());
   326               size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
   327                 strlen(current) + strlen(loader2) + strlen(failed_type_name);
   328               char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
   329               jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
   330                            failed_type_name);
   331               THROW_MSG_(vmSymbols::java_lang_LinkageError(), buf, false);
   332             }
   333           }
   334         }
   335         put_method_at(target_method(), i);
   338         if (same_access) {
   339           // target and match has same accessiblity - share entry
   340           allocate_new = false;
   341           target_method()->set_vtable_index(i);
   342 #ifndef PRODUCT
   343           if (PrintVtables && Verbose) {
   344             AccessType targetacc;
   345             if (target_method()->is_protected() ||
   346                  target_method()->is_public()) {
   347                targetacc =  acc_publicprotected;
   348             } else {
   349               targetacc = target_method()->is_package_private() ? acc_package_private : acc_private;
   350             }
   351             tty->print_cr("overriding with %s::%s index %d, original flags: %x overriders flags: %x",
   352              _klass->internal_name(), (target_method() != NULL) ?
   353              target_method()->name()->as_C_string() : "<NULL>", i,
   354              at, targetacc);
   355           }
   356 #endif /*PRODUCT*/
   357         } else {
   358 #ifndef PRODUCT
   359           if (PrintVtables && Verbose) {
   360             AccessType targetacc;
   361             if (target_method()->is_protected() ||
   362                  target_method()->is_public()) {
   363                targetacc =  acc_publicprotected;
   364             } else {
   365               targetacc = target_method()->is_package_private() ? acc_package_private : acc_private;
   366             }
   367             tty->print_cr("override %s %s::%s at index %d, original flags: %x overriders flags: %x",
   368             allocate_new ? "+ new" : "only",
   369             _klass->internal_name(), (target_method() != NULL) ?
   370             target_method()->name()->as_C_string() : "<NULL>", i,
   371             at, targetacc);
   372            }
   373 #endif /*PRODUCT*/
   374         }
   375       }
   376     }
   377   }
   378   return allocate_new;
   379 }
   383 void klassVtable::put_method_at(methodOop m, int index) {
   384   assert(m->is_oop_or_null(), "Not an oop or null");
   385 #ifndef PRODUCT
   386   if (PrintVtables && Verbose) {
   387     tty->print_cr("adding %s::%s at index %d", _klass->internal_name(),
   388       (m != NULL) ? m->name()->as_C_string() : "<NULL>", index);
   389   }
   390   assert(unchecked_method_at(index)->is_oop_or_null(), "Not an oop or null");
   391 #endif
   392   table()[index].set(m);
   393 }
   395 // Find out if a method "m" with superclass "super", loader "classloader" and
   396 // name "classname" needs a new vtable entry.  Let P be a class package defined
   397 // by "classloader" and "classname".
   398 // NOTE: The logic used here is very similar to the one used for computing
   399 // the vtables indices for a method. We cannot directly use that function because,
   400 // when the Universe is boostrapping, a super's vtable might not be initialized.
   401 bool klassVtable::needs_new_vtable_entry(methodOop target_method,
   402                                          klassOop super,
   403                                          oop classloader,
   404                                          symbolOop classname,
   405                                          AccessFlags class_flags) {
   406   if ((class_flags.is_final() || target_method->is_final()) ||
   407       // a final method never needs a new entry; final methods can be statically
   408       // resolved and they have to be present in the vtable only if they override
   409       // a super's method, in which case they re-use its entry
   410       (target_method->is_static()) ||
   411       // static methods don't need to be in vtable
   412       (target_method->name() ==  vmSymbols::object_initializer_name())
   413       // <init> is never called dynamically-bound
   414       ) {
   415     return false;
   416   }
   418   // we need a new entry if there is no superclass
   419   if (super == NULL) {
   420     return true;
   421   }
   423   // private methods always have a new entry in the vtable
   424   if (target_method->is_private()) {
   425     return true;
   426   }
   428   // search through the super class hierarchy to see if we need
   429   // a new entry
   430   symbolOop name = target_method->name();
   431   symbolOop signature = target_method->signature();
   432   klassOop k = super;
   433   methodOop match_method = NULL;
   434   instanceKlass *holder = NULL;
   435   while (k != NULL) {
   436     // lookup through the hierarchy for a method with matching name and sign.
   437     match_method = instanceKlass::cast(k)->lookup_method(name, signature);
   438     if (match_method == NULL) {
   439       break; // we still have to search for a matching miranda method
   440     }
   441     // get the class holding the matching method
   442     holder = instanceKlass::cast(match_method->method_holder());
   444     if (!match_method->is_static()) { // we want only instance method matches
   445       if ((target_method->is_public() || target_method->is_protected()) &&
   446           (match_method->is_public()  || match_method->is_protected())) {
   447         // target and match are public/protected; we do not need a new entry
   448         return false;
   449       }
   451       if (target_method->is_package_private() &&
   452           match_method->is_package_private() &&
   453           holder->is_same_class_package(classloader, classname)) {
   454         // target and match are P private; we do not need a new entry
   455         return false;
   456       }
   457     }
   459     k = holder->super(); // haven't found a match yet; continue to look
   460   }
   462   // if the target method is public or protected it may have a matching
   463   // miranda method in the super, whose entry it should re-use.
   464   if (target_method->is_public() || target_method->is_protected()) {
   465     instanceKlass *sk = instanceKlass::cast(super);
   466     if (sk->has_miranda_methods()) {
   467       if (sk->lookup_method_in_all_interfaces(name, signature) != NULL) {
   468         return false;  // found a matching miranda; we do not need a new entry
   469       }
   470     }
   471   }
   473   return true; // found no match; we need a new entry
   474 }
   476 // Support for miranda methods
   478 // get the vtable index of a miranda method with matching "name" and "signature"
   479 int klassVtable::index_of_miranda(symbolOop name, symbolOop signature) {
   480   // search from the bottom, might be faster
   481   for (int i = (length() - 1); i >= 0; i--) {
   482     methodOop m = table()[i].method();
   483     if (is_miranda_entry_at(i) &&
   484         m->name() == name && m->signature() == signature) {
   485       return i;
   486     }
   487   }
   488   return methodOopDesc::invalid_vtable_index;
   489 }
   491 // check if an entry is miranda
   492 bool klassVtable::is_miranda_entry_at(int i) {
   493   methodOop m = method_at(i);
   494   klassOop method_holder = m->method_holder();
   495   instanceKlass *mhk = instanceKlass::cast(method_holder);
   497   // miranda methods are interface methods in a class's vtable
   498   if (mhk->is_interface()) {
   499     assert(m->is_public() && m->is_abstract(), "should be public and abstract");
   500     assert(ik()->implements_interface(method_holder) , "this class should implement the interface");
   501     assert(is_miranda(m, ik()->methods(), ik()->super()), "should be a miranda_method");
   502     return true;
   503   }
   504   return false;
   505 }
   507 // check if a method is a miranda method, given a class's methods table and it's super
   508 // the caller must make sure that the method belongs to an interface implemented by the class
   509 bool klassVtable::is_miranda(methodOop m, objArrayOop class_methods, klassOop super) {
   510   symbolOop name = m->name();
   511   symbolOop signature = m->signature();
   512   if (instanceKlass::find_method(class_methods, name, signature) == NULL) {
   513      // did not find it in the method table of the current class
   514     if (super == NULL) {
   515       // super doesn't exist
   516       return true;
   517     } else {
   518       if (instanceKlass::cast(super)->lookup_method(name, signature) == NULL) {
   519         // super class hierarchy does not implement it
   520         return true;
   521       }
   522     }
   523   }
   524   return false;
   525 }
   527 void klassVtable::add_new_mirandas_to_list(GrowableArray<methodOop>* list_of_current_mirandas,
   528                                            objArrayOop current_interface_methods,
   529                                            objArrayOop class_methods,
   530                                            klassOop super) {
   531   // iterate thru the current interface's method to see if it a miranda
   532   int num_methods = current_interface_methods->length();
   533   for (int i = 0; i < num_methods; i++) {
   534     methodOop im = methodOop(current_interface_methods->obj_at(i));
   535     bool is_duplicate = false;
   536     int num_of_current_mirandas = list_of_current_mirandas->length();
   537     // check for duplicate mirandas in different interfaces we implement
   538     for (int j = 0; j < num_of_current_mirandas; j++) {
   539       methodOop miranda = list_of_current_mirandas->at(j);
   540       if ((im->name() == miranda->name()) &&
   541           (im->signature() == miranda->signature())) {
   542         is_duplicate = true;
   543         break;
   544       }
   545     }
   547     if (!is_duplicate) { // we don't want duplicate miranda entries in the vtable
   548       if (is_miranda(im, class_methods, super)) { // is it a miranda at all?
   549         instanceKlass *sk = instanceKlass::cast(super);
   550         // check if it is a duplicate of a super's miranda
   551         if (sk->lookup_method_in_all_interfaces(im->name(), im->signature()) == NULL) {
   552           list_of_current_mirandas->append(im);
   553         }
   554       }
   555     }
   556   }
   557 }
   559 void klassVtable::get_mirandas(GrowableArray<methodOop>* mirandas,
   560                                klassOop super, objArrayOop class_methods,
   561                                objArrayOop local_interfaces) {
   562   assert((mirandas->length() == 0) , "current mirandas must be 0");
   564   // iterate thru the local interfaces looking for a miranda
   565   int num_local_ifs = local_interfaces->length();
   566   for (int i = 0; i < num_local_ifs; i++) {
   567     instanceKlass *ik = instanceKlass::cast(klassOop(local_interfaces->obj_at(i)));
   568     add_new_mirandas_to_list(mirandas, ik->methods(), class_methods, super);
   569     // iterate thru each local's super interfaces
   570     objArrayOop super_ifs = ik->transitive_interfaces();
   571     int num_super_ifs = super_ifs->length();
   572     for (int j = 0; j < num_super_ifs; j++) {
   573       instanceKlass *sik = instanceKlass::cast(klassOop(super_ifs->obj_at(j)));
   574       add_new_mirandas_to_list(mirandas, sik->methods(), class_methods, super);
   575     }
   576   }
   577 }
   579 // get number of mirandas
   580 int klassVtable::get_num_mirandas(klassOop super, objArrayOop class_methods, objArrayOop local_interfaces) {
   581   ResourceMark rm;
   582   GrowableArray<methodOop>* mirandas = new GrowableArray<methodOop>(20);
   583   get_mirandas(mirandas, super, class_methods, local_interfaces);
   584   return mirandas->length();
   585 }
   587 // fill in mirandas
   588 void klassVtable::fill_in_mirandas(int& initialized) {
   589   ResourceMark rm;
   590   GrowableArray<methodOop>* mirandas = new GrowableArray<methodOop>(20);
   591   instanceKlass *this_ik = ik();
   592   get_mirandas(mirandas, this_ik->super(), this_ik->methods(), this_ik->local_interfaces());
   593   int num_mirandas = mirandas->length();
   594   for (int i = 0; i < num_mirandas; i++) {
   595     put_method_at(mirandas->at(i), initialized);
   596     initialized++;
   597   }
   598 }
   600 void klassVtable::copy_vtable_to(vtableEntry* start) {
   601   Copy::disjoint_words((HeapWord*)table(), (HeapWord*)start, _length * vtableEntry::size());
   602 }
   604 void klassVtable::adjust_method_entries(methodOop* old_methods, methodOop* new_methods,
   605                                         int methods_length, bool * trace_name_printed) {
   606   // search the vtable for uses of either obsolete or EMCP methods
   607   for (int j = 0; j < methods_length; j++) {
   608     methodOop old_method = old_methods[j];
   609     methodOop new_method = new_methods[j];
   611     // In the vast majority of cases we could get the vtable index
   612     // by using:  old_method->vtable_index()
   613     // However, there are rare cases, eg. sun.awt.X11.XDecoratedPeer.getX()
   614     // in sun.awt.X11.XFramePeer where methods occur more than once in the
   615     // vtable, so, alas, we must do an exhaustive search.
   616     for (int index = 0; index < length(); index++) {
   617       if (unchecked_method_at(index) == old_method) {
   618         put_method_at(new_method, index);
   620         if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
   621           if (!(*trace_name_printed)) {
   622             // RC_TRACE_MESG macro has an embedded ResourceMark
   623             RC_TRACE_MESG(("adjust: name=%s",
   624                            Klass::cast(old_method->method_holder())->external_name()));
   625             *trace_name_printed = true;
   626           }
   627           // RC_TRACE macro has an embedded ResourceMark
   628           RC_TRACE(0x00100000, ("vtable method update: %s(%s)",
   629                                 new_method->name()->as_C_string(),
   630                                 new_method->signature()->as_C_string()));
   631         }
   632       }
   633     }
   634   }
   635 }
   638 // Garbage collection
   639 void klassVtable::oop_follow_contents() {
   640   int len = length();
   641   for (int i = 0; i < len; i++) {
   642     MarkSweep::mark_and_push(adr_method_at(i));
   643   }
   644 }
   646 #ifndef SERIALGC
   647 void klassVtable::oop_follow_contents(ParCompactionManager* cm) {
   648   int len = length();
   649   for (int i = 0; i < len; i++) {
   650     PSParallelCompact::mark_and_push(cm, adr_method_at(i));
   651   }
   652 }
   653 #endif // SERIALGC
   655 void klassVtable::oop_adjust_pointers() {
   656   int len = length();
   657   for (int i = 0; i < len; i++) {
   658     MarkSweep::adjust_pointer(adr_method_at(i));
   659   }
   660 }
   662 #ifndef SERIALGC
   663 void klassVtable::oop_update_pointers(ParCompactionManager* cm) {
   664   const int n = length();
   665   for (int i = 0; i < n; i++) {
   666     PSParallelCompact::adjust_pointer(adr_method_at(i));
   667   }
   668 }
   670 void klassVtable::oop_update_pointers(ParCompactionManager* cm,
   671                                       HeapWord* beg_addr, HeapWord* end_addr) {
   672   const int n = length();
   673   const int entry_size = vtableEntry::size();
   675   int beg_idx = 0;
   676   HeapWord* const method_0 = (HeapWord*)adr_method_at(0);
   677   if (beg_addr > method_0) {
   678     // it's safe to use cast, as we have guarantees on vtable size to be sane
   679     beg_idx = int((pointer_delta(beg_addr, method_0) + entry_size - 1) / entry_size);
   680   }
   682   oop* const beg_oop = adr_method_at(beg_idx);
   683   oop* const end_oop = MIN2((oop*)end_addr, adr_method_at(n));
   684   for (oop* cur_oop = beg_oop; cur_oop < end_oop; cur_oop += entry_size) {
   685     PSParallelCompact::adjust_pointer(cur_oop);
   686   }
   687 }
   688 #endif // SERIALGC
   690 // Iterators
   691 void klassVtable::oop_oop_iterate(OopClosure* blk) {
   692   int len = length();
   693   for (int i = 0; i < len; i++) {
   694     blk->do_oop(adr_method_at(i));
   695   }
   696 }
   698 void klassVtable::oop_oop_iterate_m(OopClosure* blk, MemRegion mr) {
   699   int len = length();
   700   int i;
   701   for (i = 0; i < len; i++) {
   702     if ((HeapWord*)adr_method_at(i) >= mr.start()) break;
   703   }
   704   for (; i < len; i++) {
   705     oop* adr = adr_method_at(i);
   706     if ((HeapWord*)adr < mr.end()) blk->do_oop(adr);
   707   }
   708 }
   710 //-----------------------------------------------------------------------------------------
   711 // Itable code
   713 // Initialize a itableMethodEntry
   714 void itableMethodEntry::initialize(methodOop m) {
   715   if (m == NULL) return;
   717   _method = m;
   718 }
   720 klassItable::klassItable(instanceKlassHandle klass) {
   721   _klass = klass;
   723   if (klass->itable_length() > 0) {
   724     itableOffsetEntry* offset_entry = (itableOffsetEntry*)klass->start_of_itable();
   725     if (offset_entry  != NULL && offset_entry->interface_klass() != NULL) { // Check that itable is initialized
   726       // First offset entry points to the first method_entry
   727       intptr_t* method_entry  = (intptr_t *)(((address)klass->as_klassOop()) + offset_entry->offset());
   728       intptr_t* end         = klass->end_of_itable();
   730       _table_offset      = (intptr_t*)offset_entry - (intptr_t*)klass->as_klassOop();
   731       _size_offset_table = (method_entry - ((intptr_t*)offset_entry)) / itableOffsetEntry::size();
   732       _size_method_table = (end - method_entry)                  / itableMethodEntry::size();
   733       assert(_table_offset >= 0 && _size_offset_table >= 0 && _size_method_table >= 0, "wrong computation");
   734       return;
   735     }
   736   }
   738   // The length of the itable was either zero, or it has not yet been initialized.
   739   _table_offset      = 0;
   740   _size_offset_table = 0;
   741   _size_method_table = 0;
   742 }
   744 // Garbage Collection
   746 void klassItable::oop_follow_contents() {
   747   // offset table
   748   itableOffsetEntry* ioe = offset_entry(0);
   749   for(int i = 0; i < _size_offset_table; i++) {
   750     MarkSweep::mark_and_push((oop*)&ioe->_interface);
   751     ioe++;
   752   }
   754   // method table
   755   itableMethodEntry* ime = method_entry(0);
   756   for(int j = 0; j < _size_method_table; j++) {
   757     MarkSweep::mark_and_push((oop*)&ime->_method);
   758     ime++;
   759   }
   760 }
   762 #ifndef SERIALGC
   763 void klassItable::oop_follow_contents(ParCompactionManager* cm) {
   764   // offset table
   765   itableOffsetEntry* ioe = offset_entry(0);
   766   for(int i = 0; i < _size_offset_table; i++) {
   767     PSParallelCompact::mark_and_push(cm, (oop*)&ioe->_interface);
   768     ioe++;
   769   }
   771   // method table
   772   itableMethodEntry* ime = method_entry(0);
   773   for(int j = 0; j < _size_method_table; j++) {
   774     PSParallelCompact::mark_and_push(cm, (oop*)&ime->_method);
   775     ime++;
   776   }
   777 }
   778 #endif // SERIALGC
   780 void klassItable::oop_adjust_pointers() {
   781   // offset table
   782   itableOffsetEntry* ioe = offset_entry(0);
   783   for(int i = 0; i < _size_offset_table; i++) {
   784     MarkSweep::adjust_pointer((oop*)&ioe->_interface);
   785     ioe++;
   786   }
   788   // method table
   789   itableMethodEntry* ime = method_entry(0);
   790   for(int j = 0; j < _size_method_table; j++) {
   791     MarkSweep::adjust_pointer((oop*)&ime->_method);
   792     ime++;
   793   }
   794 }
   796 #ifndef SERIALGC
   797 void klassItable::oop_update_pointers(ParCompactionManager* cm) {
   798   // offset table
   799   itableOffsetEntry* ioe = offset_entry(0);
   800   for(int i = 0; i < _size_offset_table; i++) {
   801     PSParallelCompact::adjust_pointer((oop*)&ioe->_interface);
   802     ioe++;
   803   }
   805   // method table
   806   itableMethodEntry* ime = method_entry(0);
   807   for(int j = 0; j < _size_method_table; j++) {
   808     PSParallelCompact::adjust_pointer((oop*)&ime->_method);
   809     ime++;
   810   }
   811 }
   813 void klassItable::oop_update_pointers(ParCompactionManager* cm,
   814                                       HeapWord* beg_addr, HeapWord* end_addr) {
   815   // offset table
   816   itableOffsetEntry* ioe = offset_entry(0);
   817   for(int i = 0; i < _size_offset_table; i++) {
   818     oop* p = (oop*)&ioe->_interface;
   819     PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   820     ioe++;
   821   }
   823   // method table
   824   itableMethodEntry* ime = method_entry(0);
   825   for(int j = 0; j < _size_method_table; j++) {
   826     oop* p = (oop*)&ime->_method;
   827     PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   828     ime++;
   829   }
   830 }
   831 #endif // SERIALGC
   833 // Iterators
   834 void klassItable::oop_oop_iterate(OopClosure* blk) {
   835   // offset table
   836   itableOffsetEntry* ioe = offset_entry(0);
   837   for(int i = 0; i < _size_offset_table; i++) {
   838     blk->do_oop((oop*)&ioe->_interface);
   839     ioe++;
   840   }
   842   // method table
   843   itableMethodEntry* ime = method_entry(0);
   844   for(int j = 0; j < _size_method_table; j++) {
   845     blk->do_oop((oop*)&ime->_method);
   846     ime++;
   847   }
   848 }
   850 void klassItable::oop_oop_iterate_m(OopClosure* blk, MemRegion mr) {
   851   // offset table
   852   itableOffsetEntry* ioe = offset_entry(0);
   853   for(int i = 0; i < _size_offset_table; i++) {
   854     oop* adr = (oop*)&ioe->_interface;
   855     if (mr.contains(adr)) blk->do_oop(adr);
   856     ioe++;
   857   }
   859   // method table
   860   itableMethodEntry* ime = method_entry(0);
   861   for(int j = 0; j < _size_method_table; j++) {
   862     oop* adr = (oop*)&ime->_method;
   863     if (mr.contains(adr)) blk->do_oop(adr);
   864     ime++;
   865   }
   866 }
   869 static int initialize_count = 0;
   871 // Initialization
   872 void klassItable::initialize_itable(bool checkconstraints, TRAPS) {
   873   // Cannot be setup doing bootstrapping, interfaces don't have
   874   // itables, and klass with only ones entry have empty itables
   875   if (Universe::is_bootstrapping() ||
   876       _klass->is_interface() ||
   877       _klass->itable_length() == itableOffsetEntry::size()) return;
   879   // There's alway an extra itable entry so we can null-terminate it.
   880   guarantee(size_offset_table() >= 1, "too small");
   881   int num_interfaces = size_offset_table() - 1;
   882   if (num_interfaces > 0) {
   883     if (TraceItables) tty->print_cr("%3d: Initializing itables for %s", ++initialize_count,
   884                                     _klass->name()->as_C_string());
   887     // Interate through all interfaces
   888     int i;
   889     for(i = 0; i < num_interfaces; i++) {
   890       itableOffsetEntry* ioe = offset_entry(i);
   891       KlassHandle interf_h (THREAD, ioe->interface_klass());
   892       assert(interf_h() != NULL && ioe->offset() != 0, "bad offset entry in itable");
   893       initialize_itable_for_interface(ioe->offset(), interf_h, checkconstraints, CHECK);
   894     }
   896   }
   897   // Check that the last entry is empty
   898   itableOffsetEntry* ioe = offset_entry(size_offset_table() - 1);
   899   guarantee(ioe->interface_klass() == NULL && ioe->offset() == 0, "terminator entry missing");
   900 }
   903 void klassItable::initialize_itable_for_interface(int method_table_offset, KlassHandle interf_h, bool checkconstraints, TRAPS) {
   904   objArrayHandle methods(THREAD, instanceKlass::cast(interf_h())->methods());
   905   int nof_methods = methods()->length();
   906   HandleMark hm;
   907   KlassHandle klass = _klass;
   908   assert(nof_methods > 0, "at least one method must exist for interface to be in vtable")
   909   Handle interface_loader (THREAD, instanceKlass::cast(interf_h())->class_loader());
   910   int ime_num = 0;
   912   // Skip first methodOop if it is a class initializer
   913   int i = ((methodOop)methods()->obj_at(0))->name() != vmSymbols::class_initializer_name() ? 0 : 1;
   915   // m, method_name, method_signature, klass reset each loop so they
   916   // don't need preserving across check_signature_loaders call
   917   // methods needs a handle in case of gc from check_signature_loaders
   918   for(; i < nof_methods; i++) {
   919     methodOop m = (methodOop)methods()->obj_at(i);
   920     symbolOop method_name = m->name();
   921     symbolOop method_signature = m->signature();
   923     // This is same code as in Linkresolver::lookup_instance_method_in_klasses
   924     methodOop target = klass->uncached_lookup_method(method_name, method_signature);
   925     while (target != NULL && target->is_static()) {
   926       // continue with recursive lookup through the superclass
   927       klassOop super = Klass::cast(target->method_holder())->super();
   928       target = (super == NULL) ? methodOop(NULL) : Klass::cast(super)->uncached_lookup_method(method_name, method_signature);
   929     }
   930     if (target == NULL || !target->is_public() || target->is_abstract()) {
   931       // Entry do not resolve. Leave it empty
   932     } else {
   933       // Entry did resolve, check loader constraints before initializing
   934       // if checkconstraints requested
   935       methodHandle  target_h (THREAD, target); // preserve across gc
   936       if (checkconstraints) {
   937         Handle method_holder_loader (THREAD, instanceKlass::cast(target->method_holder())->class_loader());
   938         if (method_holder_loader() != interface_loader()) {
   939           ResourceMark rm(THREAD);
   940           char* failed_type_name =
   941             SystemDictionary::check_signature_loaders(method_signature,
   942                                                       method_holder_loader,
   943                                                       interface_loader,
   944                                                       true, CHECK);
   945           if (failed_type_name != NULL) {
   946             const char* msg = "loader constraint violation in interface "
   947               "itable initialization: when resolving method \"%s\" the class"
   948               " loader (instance of %s) of the current class, %s, "
   949               "and the class loader (instance of %s) for interface "
   950               "%s have different Class objects for the type %s "
   951               "used in the signature";
   952             char* sig = target_h()->name_and_sig_as_C_string();
   953             const char* loader1 = SystemDictionary::loader_name(method_holder_loader());
   954             char* current = klass->name()->as_C_string();
   955             const char* loader2 = SystemDictionary::loader_name(interface_loader());
   956             char* iface = instanceKlass::cast(interf_h())->name()->as_C_string();
   957             size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
   958               strlen(current) + strlen(loader2) + strlen(iface) +
   959               strlen(failed_type_name);
   960             char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
   961             jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
   962                          iface, failed_type_name);
   963             THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
   964           }
   965         }
   966       }
   968       // ime may have moved during GC so recalculate address
   969       itableOffsetEntry::method_entry(_klass(), method_table_offset)[ime_num].initialize(target_h());
   970     }
   971     // Progress to next entry
   972     ime_num++;
   973   }
   974 }
   976 // Update entry for specific methodOop
   977 void klassItable::initialize_with_method(methodOop m) {
   978   itableMethodEntry* ime = method_entry(0);
   979   for(int i = 0; i < _size_method_table; i++) {
   980     if (ime->method() == m) {
   981       ime->initialize(m);
   982     }
   983     ime++;
   984   }
   985 }
   987 void klassItable::adjust_method_entries(methodOop* old_methods, methodOop* new_methods,
   988                                         int methods_length, bool * trace_name_printed) {
   989   // search the itable for uses of either obsolete or EMCP methods
   990   for (int j = 0; j < methods_length; j++) {
   991     methodOop old_method = old_methods[j];
   992     methodOop new_method = new_methods[j];
   993     itableMethodEntry* ime = method_entry(0);
   995     // The itable can describe more than one interface and the same
   996     // method signature can be specified by more than one interface.
   997     // This means we have to do an exhaustive search to find all the
   998     // old_method references.
   999     for (int i = 0; i < _size_method_table; i++) {
  1000       if (ime->method() == old_method) {
  1001         ime->initialize(new_method);
  1003         if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
  1004           if (!(*trace_name_printed)) {
  1005             // RC_TRACE_MESG macro has an embedded ResourceMark
  1006             RC_TRACE_MESG(("adjust: name=%s",
  1007               Klass::cast(old_method->method_holder())->external_name()));
  1008             *trace_name_printed = true;
  1010           // RC_TRACE macro has an embedded ResourceMark
  1011           RC_TRACE(0x00200000, ("itable method update: %s(%s)",
  1012             new_method->name()->as_C_string(),
  1013             new_method->signature()->as_C_string()));
  1016       ime++;
  1022 // Setup
  1023 class InterfaceVisiterClosure : public StackObj {
  1024  public:
  1025   virtual void doit(klassOop intf, int method_count) = 0;
  1026 };
  1028 // Visit all interfaces with at-least one method (excluding <clinit>)
  1029 void visit_all_interfaces(objArrayOop transitive_intf, InterfaceVisiterClosure *blk) {
  1030   // Handle array argument
  1031   for(int i = 0; i < transitive_intf->length(); i++) {
  1032     klassOop intf = (klassOop)transitive_intf->obj_at(i);
  1033     assert(Klass::cast(intf)->is_interface(), "sanity check");
  1035     // Find no. of methods excluding a <clinit>
  1036     int method_count = instanceKlass::cast(intf)->methods()->length();
  1037     if (method_count > 0) {
  1038       methodOop m = (methodOop)instanceKlass::cast(intf)->methods()->obj_at(0);
  1039       assert(m != NULL && m->is_method(), "sanity check");
  1040       if (m->name() == vmSymbols::object_initializer_name()) {
  1041         method_count--;
  1045     // Only count interfaces with at least one method
  1046     if (method_count > 0) {
  1047       blk->doit(intf, method_count);
  1052 class CountInterfacesClosure : public InterfaceVisiterClosure {
  1053  private:
  1054   int _nof_methods;
  1055   int _nof_interfaces;
  1056  public:
  1057    CountInterfacesClosure() { _nof_methods = 0; _nof_interfaces = 0; }
  1059    int nof_methods() const    { return _nof_methods; }
  1060    int nof_interfaces() const { return _nof_interfaces; }
  1062    void doit(klassOop intf, int method_count) { _nof_methods += method_count; _nof_interfaces++; }
  1063 };
  1065 class SetupItableClosure : public InterfaceVisiterClosure  {
  1066  private:
  1067   itableOffsetEntry* _offset_entry;
  1068   itableMethodEntry* _method_entry;
  1069   address            _klass_begin;
  1070  public:
  1071   SetupItableClosure(address klass_begin, itableOffsetEntry* offset_entry, itableMethodEntry* method_entry) {
  1072     _klass_begin  = klass_begin;
  1073     _offset_entry = offset_entry;
  1074     _method_entry = method_entry;
  1077   itableMethodEntry* method_entry() const { return _method_entry; }
  1079   void doit(klassOop intf, int method_count) {
  1080     int offset = ((address)_method_entry) - _klass_begin;
  1081     _offset_entry->initialize(intf, offset);
  1082     _offset_entry++;
  1083     _method_entry += method_count;
  1085 };
  1087 int klassItable::compute_itable_size(objArrayHandle transitive_interfaces) {
  1088   // Count no of interfaces and total number of interface methods
  1089   CountInterfacesClosure cic;
  1090   visit_all_interfaces(transitive_interfaces(), &cic);
  1092   // There's alway an extra itable entry so we can null-terminate it.
  1093   int itable_size = calc_itable_size(cic.nof_interfaces() + 1, cic.nof_methods());
  1095   // Statistics
  1096   update_stats(itable_size * HeapWordSize);
  1098   return itable_size;
  1102 // Fill out offset table and interface klasses into the itable space
  1103 void klassItable::setup_itable_offset_table(instanceKlassHandle klass) {
  1104   if (klass->itable_length() == 0) return;
  1105   assert(!klass->is_interface(), "Should have zero length itable");
  1107   // Count no of interfaces and total number of interface methods
  1108   CountInterfacesClosure cic;
  1109   visit_all_interfaces(klass->transitive_interfaces(), &cic);
  1110   int nof_methods    = cic.nof_methods();
  1111   int nof_interfaces = cic.nof_interfaces();
  1113   // Add one extra entry so we can null-terminate the table
  1114   nof_interfaces++;
  1116   assert(compute_itable_size(objArrayHandle(klass->transitive_interfaces())) ==
  1117          calc_itable_size(nof_interfaces, nof_methods),
  1118          "mismatch calculation of itable size");
  1120   // Fill-out offset table
  1121   itableOffsetEntry* ioe = (itableOffsetEntry*)klass->start_of_itable();
  1122   itableMethodEntry* ime = (itableMethodEntry*)(ioe + nof_interfaces);
  1123   intptr_t* end               = klass->end_of_itable();
  1124   assert((oop*)(ime + nof_methods) <= (oop*)klass->start_of_static_fields(), "wrong offset calculation (1)");
  1125   assert((oop*)(end) == (oop*)(ime + nof_methods),                      "wrong offset calculation (2)");
  1127   // Visit all interfaces and initialize itable offset table
  1128   SetupItableClosure sic((address)klass->as_klassOop(), ioe, ime);
  1129   visit_all_interfaces(klass->transitive_interfaces(), &sic);
  1131 #ifdef ASSERT
  1132   ime  = sic.method_entry();
  1133   oop* v = (oop*) klass->end_of_itable();
  1134   assert( (oop*)(ime) == v, "wrong offset calculation (2)");
  1135 #endif
  1139 // m must be a method in an interface
  1140 int klassItable::compute_itable_index(methodOop m) {
  1141   klassOop intf = m->method_holder();
  1142   assert(instanceKlass::cast(intf)->is_interface(), "sanity check");
  1143   objArrayOop methods = instanceKlass::cast(intf)->methods();
  1144   int index = 0;
  1145   while(methods->obj_at(index) != m) {
  1146     index++;
  1147     assert(index < methods->length(), "should find index for resolve_invoke");
  1149   // Adjust for <clinit>, which is left out of table if first method
  1150   if (methods->length() > 0 && ((methodOop)methods->obj_at(0))->name() == vmSymbols::class_initializer_name()) {
  1151     index--;
  1153   return index;
  1157 // inverse to compute_itable_index
  1158 methodOop klassItable::method_for_itable_index(klassOop intf, int itable_index) {
  1159   assert(instanceKlass::cast(intf)->is_interface(), "sanity check");
  1160   objArrayOop methods = instanceKlass::cast(intf)->methods();
  1162   int index = itable_index;
  1163   // Adjust for <clinit>, which is left out of table if first method
  1164   if (methods->length() > 0 && ((methodOop)methods->obj_at(0))->name() == vmSymbols::class_initializer_name()) {
  1165     index++;
  1168   if (itable_index < 0 || index >= methods->length())
  1169     return NULL;                // help caller defend against bad indexes
  1171   methodOop m = (methodOop)methods->obj_at(index);
  1172   assert(compute_itable_index(m) == itable_index, "correct inverse");
  1174   return m;
  1177 void klassVtable::verify(outputStream* st, bool forced) {
  1178   // make sure table is initialized
  1179   if (!Universe::is_fully_initialized()) return;
  1180 #ifndef PRODUCT
  1181   // avoid redundant verifies
  1182   if (!forced && _verify_count == Universe::verify_count()) return;
  1183   _verify_count = Universe::verify_count();
  1184 #endif
  1185   oop* end_of_obj = (oop*)_klass() + _klass()->size();
  1186   oop* end_of_vtable = (oop *)&table()[_length];
  1187   if (end_of_vtable > end_of_obj) {
  1188     fatal1("klass %s: klass object too short (vtable extends beyond end)",
  1189           _klass->internal_name());
  1192   for (int i = 0; i < _length; i++) table()[i].verify(this, st);
  1193   // verify consistency with superKlass vtable
  1194   klassOop super = _klass->super();
  1195   if (super != NULL) {
  1196     instanceKlass* sk = instanceKlass::cast(super);
  1197     klassVtable* vt = sk->vtable();
  1198     for (int i = 0; i < vt->length(); i++) {
  1199       verify_against(st, vt, i);
  1204 void klassVtable::verify_against(outputStream* st, klassVtable* vt, int index) {
  1205   vtableEntry* vte = &vt->table()[index];
  1206   if (vte->method()->name()      != table()[index].method()->name() ||
  1207       vte->method()->signature() != table()[index].method()->signature()) {
  1208     fatal("mismatched name/signature of vtable entries");
  1212 #ifndef PRODUCT
  1213 void klassVtable::print() {
  1214   ResourceMark rm;
  1215   tty->print("klassVtable for klass %s (length %d):\n", _klass->internal_name(), length());
  1216   for (int i = 0; i < length(); i++) {
  1217     table()[i].print();
  1218     tty->cr();
  1221 #endif
  1223 void vtableEntry::verify(klassVtable* vt, outputStream* st) {
  1224   NOT_PRODUCT(FlagSetting fs(IgnoreLockingAssertions, true));
  1225   assert(method() != NULL, "must have set method");
  1226   method()->verify();
  1227   // we sub_type, because it could be a miranda method
  1228   if (!vt->klass()->is_subtype_of(method()->method_holder())) {
  1229 #ifndef PRODUCT
  1230     print();
  1231 #endif
  1232     fatal1("vtableEntry %#lx: method is from subclass", this);
  1236 #ifndef PRODUCT
  1238 void vtableEntry::print() {
  1239   ResourceMark rm;
  1240   tty->print("vtableEntry %s: ", method()->name()->as_C_string());
  1241   if (Verbose) {
  1242     tty->print("m %#lx ", (address)method());
  1246 class VtableStats : AllStatic {
  1247  public:
  1248   static int no_klasses;                // # classes with vtables
  1249   static int no_array_klasses;          // # array classes
  1250   static int no_instance_klasses;       // # instanceKlasses
  1251   static int sum_of_vtable_len;         // total # of vtable entries
  1252   static int sum_of_array_vtable_len;   // total # of vtable entries in array klasses only
  1253   static int fixed;                     // total fixed overhead in bytes
  1254   static int filler;                    // overhead caused by filler bytes
  1255   static int entries;                   // total bytes consumed by vtable entries
  1256   static int array_entries;             // total bytes consumed by array vtable entries
  1258   static void do_class(klassOop k) {
  1259     Klass* kl = k->klass_part();
  1260     klassVtable* vt = kl->vtable();
  1261     if (vt == NULL) return;
  1262     no_klasses++;
  1263     if (kl->oop_is_instance()) {
  1264       no_instance_klasses++;
  1265       kl->array_klasses_do(do_class);
  1267     if (kl->oop_is_array()) {
  1268       no_array_klasses++;
  1269       sum_of_array_vtable_len += vt->length();
  1271     sum_of_vtable_len += vt->length();
  1274   static void compute() {
  1275     SystemDictionary::classes_do(do_class);
  1276     fixed  = no_klasses * oopSize;      // vtable length
  1277     // filler size is a conservative approximation
  1278     filler = oopSize * (no_klasses - no_instance_klasses) * (sizeof(instanceKlass) - sizeof(arrayKlass) - 1);
  1279     entries = sizeof(vtableEntry) * sum_of_vtable_len;
  1280     array_entries = sizeof(vtableEntry) * sum_of_array_vtable_len;
  1282 };
  1284 int VtableStats::no_klasses = 0;
  1285 int VtableStats::no_array_klasses = 0;
  1286 int VtableStats::no_instance_klasses = 0;
  1287 int VtableStats::sum_of_vtable_len = 0;
  1288 int VtableStats::sum_of_array_vtable_len = 0;
  1289 int VtableStats::fixed = 0;
  1290 int VtableStats::filler = 0;
  1291 int VtableStats::entries = 0;
  1292 int VtableStats::array_entries = 0;
  1294 void klassVtable::print_statistics() {
  1295   ResourceMark rm;
  1296   HandleMark hm;
  1297   VtableStats::compute();
  1298   tty->print_cr("vtable statistics:");
  1299   tty->print_cr("%6d classes (%d instance, %d array)", VtableStats::no_klasses, VtableStats::no_instance_klasses, VtableStats::no_array_klasses);
  1300   int total = VtableStats::fixed + VtableStats::filler + VtableStats::entries;
  1301   tty->print_cr("%6d bytes fixed overhead (refs + vtable object header)", VtableStats::fixed);
  1302   tty->print_cr("%6d bytes filler overhead", VtableStats::filler);
  1303   tty->print_cr("%6d bytes for vtable entries (%d for arrays)", VtableStats::entries, VtableStats::array_entries);
  1304   tty->print_cr("%6d bytes total", total);
  1307 bool klassVtable::check_no_old_entries() {
  1308   // Check that there really is no entry
  1309   for (int i = 0; i < length(); i++) {
  1310     methodOop m = unchecked_method_at(i);
  1311     if (m != NULL) {
  1312         if (m->is_old()) {
  1313             return false;
  1317   return true;
  1320 void klassVtable::dump_vtable() {
  1321   tty->print_cr("vtable dump --");
  1322   for (int i = 0; i < length(); i++) {
  1323     methodOop m = unchecked_method_at(i);
  1324     if (m != NULL) {
  1325       tty->print("      (%5d)  ", i);
  1326       m->access_flags().print_on(tty);
  1327       tty->print(" --  ");
  1328       m->print_name(tty);
  1329       tty->cr();
  1334 int  klassItable::_total_classes;   // Total no. of classes with itables
  1335 long klassItable::_total_size;      // Total no. of bytes used for itables
  1337 void klassItable::print_statistics() {
  1338  tty->print_cr("itable statistics:");
  1339  tty->print_cr("%6d classes with itables", _total_classes);
  1340  tty->print_cr("%6d K uses for itables (average by class: %d bytes)", _total_size / K, _total_size / _total_classes);
  1343 #endif // PRODUCT

mercurial