163 ResourceMark rm(THREAD); |
163 ResourceMark rm(THREAD); |
164 log_trace(class, nestmates)("Checking nest membership of %s in %s", |
164 log_trace(class, nestmates)("Checking nest membership of %s in %s", |
165 k->external_name(), this->external_name()); |
165 k->external_name(), this->external_name()); |
166 } |
166 } |
167 |
167 |
168 // Check names first and if they match then check actual klass. This avoids |
168 // Check for a resolved cp entry , else fall back to a name check. |
169 // resolving anything unnecessarily. |
169 // We don't want to resolve any class other than the one being checked. |
170 for (int i = 0; i < _nest_members->length(); i++) { |
170 for (int i = 0; i < _nest_members->length(); i++) { |
171 int cp_index = _nest_members->at(i); |
171 int cp_index = _nest_members->at(i); |
172 Symbol* name = _constants->klass_name_at(cp_index); |
172 if (_constants->tag_at(cp_index).is_klass()) { |
173 if (name == k->name()) { |
|
174 log_trace(class, nestmates)("- Found it at nest_members[%d] => cp[%d]", i, cp_index); |
|
175 |
|
176 // names match so check actual klass - this may trigger class loading if |
|
177 // it doesn't match (but that should be impossible) |
|
178 Klass* k2 = _constants->klass_at(cp_index, CHECK_false); |
173 Klass* k2 = _constants->klass_at(cp_index, CHECK_false); |
179 if (k2 == k) { |
174 if (k2 == k) { |
180 log_trace(class, nestmates)("- class is listed as a nest member"); |
175 log_trace(class, nestmates)("- class is listed at nest_members[%d] => cp[%d]", i, cp_index); |
181 return true; |
176 return true; |
182 } else { |
177 } |
183 // same name but different klass! |
178 } |
184 log_trace(class, nestmates)(" - klass comparison failed!"); |
179 else { |
185 // can't have different classes for the same name, so we're done |
180 Symbol* name = _constants->klass_name_at(cp_index); |
186 return false; |
181 if (name == k->name()) { |
|
182 log_trace(class, nestmates)("- Found it at nest_members[%d] => cp[%d]", i, cp_index); |
|
183 |
|
184 // names match so check actual klass - this may trigger class loading if |
|
185 // it doesn't match (but that should be impossible) |
|
186 Klass* k2 = _constants->klass_at(cp_index, CHECK_false); |
|
187 if (k2 == k) { |
|
188 log_trace(class, nestmates)("- class is listed as a nest member"); |
|
189 return true; |
|
190 } |
|
191 else { |
|
192 // same name but different klass! |
|
193 log_trace(class, nestmates)(" - klass comparison failed!"); |
|
194 // can't have two names the same, so we're done |
|
195 return false; |
|
196 } |
187 } |
197 } |
188 } |
198 } |
189 } |
199 } |
190 log_trace(class, nestmates)("- class is NOT a nest member!"); |
200 log_trace(class, nestmates)("- class is NOT a nest member!"); |
191 return false; |
201 return false; |