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)) {
|