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