< prev index next >

src/hotspot/share/oops/klassVtable.cpp

Print this page
*** 1227,13 ***
    initialize_itable(supers);
    check_constraints(supers, CHECK);
  }
  
  inline bool interface_method_needs_itable_index(Method* m) {
!   if (m->is_static())           return false;   // e.g., Stream.empty
!   if (m->is_initializer())      return false;   // <init> or <clinit>
!   if (m->is_private())          return false;   // uses direct call
    // If an interface redeclares a method from java.lang.Object,
    // it should already have a vtable index, don't touch it.
    // e.g., CharSequence.toString (from initialize_vtable)
    // if (m->has_vtable_index())  return false; // NO!
    return true;
--- 1227,14 ---
    initialize_itable(supers);
    check_constraints(supers, CHECK);
  }
  
  inline bool interface_method_needs_itable_index(Method* m) {
!   if (m->is_static())             return false;   // e.g., Stream.empty
!   if (m->is_private())            return false;   // uses direct call
!   if (m->is_object_constructor()) return false;   // <init>(...)V
+   if (m->is_class_initializer())  return false;   // <clinit>()V
    // If an interface redeclares a method from java.lang.Object,
    // it should already have a vtable index, don't touch it.
    // e.g., CharSequence.toString (from initialize_vtable)
    // if (m->has_vtable_index())  return false; // NO!
    return true;

*** 1438,10 ***
--- 1439,22 ---
  class InterfaceVisiterClosure : public StackObj {
   public:
    virtual void doit(InstanceKlass* intf, int method_count) = 0;
  };
  
+ int count_interface_methods_needing_itable_index(Array<Method*>* methods) {
+   int method_count = 0;
+   if (methods->length() > 0) {
+     for (int i = methods->length(); --i >= 0; ) {
+       if (interface_method_needs_itable_index(methods->at(i))) {
+         method_count++;
+       }
+     }
+   }
+   return method_count;
+ }
+ 
  // Visit all interfaces with at least one itable method
  void visit_all_interfaces(Array<InstanceKlass*>* transitive_intf, InterfaceVisiterClosure *blk) {
    // Handle array argument
    for(int i = 0; i < transitive_intf->length(); i++) {
      InstanceKlass* intf = transitive_intf->at(i);

*** 1506,11 ***
  int klassItable::compute_itable_size(Array<InstanceKlass*>* transitive_interfaces) {
    // Count no of interfaces and total number of interface methods
    CountInterfacesClosure cic;
    visit_all_interfaces(transitive_interfaces, &cic);
  
!   // There's alway an extra itable entry so we can null-terminate it.
    int itable_size = calc_itable_size(cic.nof_interfaces() + 1, cic.nof_methods());
  
    // Statistics
    update_stats(itable_size * wordSize);
  
--- 1519,11 ---
  int klassItable::compute_itable_size(Array<InstanceKlass*>* transitive_interfaces) {
    // Count no of interfaces and total number of interface methods
    CountInterfacesClosure cic;
    visit_all_interfaces(transitive_interfaces, &cic);
  
!   // There's always an extra itable entry so we can null-terminate it.
    int itable_size = calc_itable_size(cic.nof_interfaces() + 1, cic.nof_methods());
  
    // Statistics
    update_stats(itable_size * wordSize);
  
< prev index next >