< prev index next >

src/hotspot/share/oops/instanceKlass.cpp

Print this page

        

*** 163,194 **** ResourceMark rm(THREAD); log_trace(class, nestmates)("Checking nest membership of %s in %s", k->external_name(), this->external_name()); } ! // Check names first and if they match then check actual klass. This avoids ! // resolving anything unnecessarily. 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) 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 different classes for the same name, so we're done return false; } } } log_trace(class, nestmates)("- class is NOT a nest member!"); return false; } // Return nest-host class, resolving, validating and saving it if needed. --- 163,204 ---- ResourceMark rm(THREAD); log_trace(class, nestmates)("Checking nest membership of %s in %s", k->external_name(), this->external_name()); } ! // 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); + if (_constants->tag_at(cp_index).value() == JVM_CONSTANT_Class) { + Klass* k2 = _constants->klass_at(cp_index, CHECK_false); + if (k2 == k) { + log_trace(class, nestmates)("- class is listed at nest_members[%d] => cp[%d]", i, cp_index); + return true; + } + } + 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; } } } + } log_trace(class, nestmates)("- class is NOT a nest member!"); return false; } // Return nest-host class, resolving, validating and saving it if needed.
< prev index next >