src/hotspot/share/oops/instanceKlass.cpp
changeset 52232 c9459e2f7bc8
parent 52096 7a1e2d7ac55a
child 52311 274ba8fbd96d
equal deleted inserted replaced
52231:66432f0e91bd 52232:c9459e2f7bc8
   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;