< prev index next >

src/hotspot/share/oops/klassVtable.cpp

Print this page




1104     // Iterate through all interfaces
1105     int i;
1106     for(i = 0; i < num_interfaces; i++) {
1107       itableOffsetEntry* ioe = offset_entry(i);
1108       HandleMark hm(THREAD);
1109       Klass* interf = ioe->interface_klass();
1110       assert(interf != NULL && ioe->offset() != 0, "bad offset entry in itable");
1111       initialize_itable_for_interface(ioe->offset(), interf, checkconstraints, CHECK);
1112     }
1113 
1114   }
1115   // Check that the last entry is empty
1116   itableOffsetEntry* ioe = offset_entry(size_offset_table() - 1);
1117   guarantee(ioe->interface_klass() == NULL && ioe->offset() == 0, "terminator entry missing");
1118 }
1119 
1120 
1121 inline bool interface_method_needs_itable_index(Method* m) {
1122   if (m->is_static())           return false;   // e.g., Stream.empty
1123   if (m->is_initializer())      return false;   // <init> or <clinit>
1124   if (m->is_private())          return false;   // requires invokeSpecial
1125   // If an interface redeclares a method from java.lang.Object,
1126   // it should already have a vtable index, don't touch it.
1127   // e.g., CharSequence.toString (from initialize_vtable)
1128   // if (m->has_vtable_index())  return false; // NO!
1129   return true;
1130 }
1131 
1132 int klassItable::assign_itable_indices_for_interface(Klass* klass) {
1133   // an interface does not have an itable, but its methods need to be numbered
1134   log_develop_debug(itables)("%3d: Initializing itable indices for interface %s",
1135                              ++initialize_count, klass->name()->as_C_string());
1136   Array<Method*>* methods = InstanceKlass::cast(klass)->methods();
1137   int nof_methods = methods->length();
1138   int ime_num = 0;
1139   for (int i = 0; i < nof_methods; i++) {
1140     Method* m = methods->at(i);
1141     if (interface_method_needs_itable_index(m)) {
1142       assert(!m->is_final_method(), "no final interface methods");
1143       // If m is already assigned a vtable index, do not disturb it.
1144       if (log_develop_is_enabled(Trace, itables)) {




1104     // Iterate through all interfaces
1105     int i;
1106     for(i = 0; i < num_interfaces; i++) {
1107       itableOffsetEntry* ioe = offset_entry(i);
1108       HandleMark hm(THREAD);
1109       Klass* interf = ioe->interface_klass();
1110       assert(interf != NULL && ioe->offset() != 0, "bad offset entry in itable");
1111       initialize_itable_for_interface(ioe->offset(), interf, checkconstraints, CHECK);
1112     }
1113 
1114   }
1115   // Check that the last entry is empty
1116   itableOffsetEntry* ioe = offset_entry(size_offset_table() - 1);
1117   guarantee(ioe->interface_klass() == NULL && ioe->offset() == 0, "terminator entry missing");
1118 }
1119 
1120 
1121 inline bool interface_method_needs_itable_index(Method* m) {
1122   if (m->is_static())           return false;   // e.g., Stream.empty
1123   if (m->is_initializer())      return false;   // <init> or <clinit>
1124   if (m->is_private())          return false;   // uses direct call
1125   // If an interface redeclares a method from java.lang.Object,
1126   // it should already have a vtable index, don't touch it.
1127   // e.g., CharSequence.toString (from initialize_vtable)
1128   // if (m->has_vtable_index())  return false; // NO!
1129   return true;
1130 }
1131 
1132 int klassItable::assign_itable_indices_for_interface(Klass* klass) {
1133   // an interface does not have an itable, but its methods need to be numbered
1134   log_develop_debug(itables)("%3d: Initializing itable indices for interface %s",
1135                              ++initialize_count, klass->name()->as_C_string());
1136   Array<Method*>* methods = InstanceKlass::cast(klass)->methods();
1137   int nof_methods = methods->length();
1138   int ime_num = 0;
1139   for (int i = 0; i < nof_methods; i++) {
1140     Method* m = methods->at(i);
1141     if (interface_method_needs_itable_index(m)) {
1142       assert(!m->is_final_method(), "no final interface methods");
1143       // If m is already assigned a vtable index, do not disturb it.
1144       if (log_develop_is_enabled(Trace, itables)) {


< prev index next >