--- old/src/hotspot/share/oops/instanceKlass.cpp 2018-10-23 08:35:07.121096522 -0400 +++ new/src/hotspot/share/oops/instanceKlass.cpp 2018-10-23 08:35:05.545006239 -0400 @@ -165,25 +165,35 @@ k->external_name(), this->external_name()); } - // Check names first and if they match then check actual klass. This avoids - // resolving anything unnecessarily. + // Check for a resolved cp entry , else fall back to a name check. + // We don't want to resolve any class other than the one being checked. for (int i = 0; i < _nest_members->length(); i++) { int cp_index = _nest_members->at(i); - Symbol* name = _constants->klass_name_at(cp_index); - if (name == k->name()) { - log_trace(class, nestmates)("- Found it at nest_members[%d] => cp[%d]", i, cp_index); - - // names match so check actual klass - this may trigger class loading if - // it doesn't match (but that should be impossible) + if (_constants->tag_at(cp_index).is_klass()) { Klass* k2 = _constants->klass_at(cp_index, CHECK_false); if (k2 == k) { - log_trace(class, nestmates)("- class is listed as a nest member"); + log_trace(class, nestmates)("- class is listed at nest_members[%d] => cp[%d]", i, cp_index); return true; - } else { - // same name but different klass! - log_trace(class, nestmates)(" - klass comparison failed!"); - // can't have different classes for the same name, so we're done - return false; + } + } + else { + Symbol* name = _constants->klass_name_at(cp_index); + if (name == k->name()) { + log_trace(class, nestmates)("- Found it at nest_members[%d] => cp[%d]", i, cp_index); + + // names match so check actual klass - this may trigger class loading if + // it doesn't match (but that should be impossible) + Klass* k2 = _constants->klass_at(cp_index, CHECK_false); + if (k2 == k) { + log_trace(class, nestmates)("- class is listed as a nest member"); + return true; + } + else { + // same name but different klass! + log_trace(class, nestmates)(" - klass comparison failed!"); + // can't have two names the same, so we're done + return false; + } } } }