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