hotspot/src/share/vm/oops/klass.cpp
changeset 14588 8ec26d2d9339
parent 14488 ab48109f7d1b
child 15482 470d0b0c09f1
child 15437 eabd4555d072
equal deleted inserted replaced
14584:bd4290e6d0a5 14588:8ec26d2d9339
   371   // make ourselves the superklass' first subklass
   371   // make ourselves the superklass' first subklass
   372   super->set_subklass(this);
   372   super->set_subklass(this);
   373   debug_only(verify();)
   373   debug_only(verify();)
   374 }
   374 }
   375 
   375 
   376 void Klass::remove_from_sibling_list() {
       
   377   // remove receiver from sibling list
       
   378   InstanceKlass* super = superklass();
       
   379   assert(super != NULL || this == SystemDictionary::Object_klass(), "should have super");
       
   380   if (super == NULL) return;        // special case: class Object
       
   381   if (super->subklass() == this) {
       
   382     // first subklass
       
   383     super->set_subklass(_next_sibling);
       
   384   } else {
       
   385     Klass* sib = super->subklass();
       
   386     while (sib->next_sibling() != this) {
       
   387       sib = sib->next_sibling();
       
   388     };
       
   389     sib->set_next_sibling(_next_sibling);
       
   390   }
       
   391 }
       
   392 
       
   393 bool Klass::is_loader_alive(BoolObjectClosure* is_alive) {
   376 bool Klass::is_loader_alive(BoolObjectClosure* is_alive) {
   394   assert(is_metadata(), "p is not meta-data");
   377   assert(is_metadata(), "p is not meta-data");
   395   assert(ClassLoaderDataGraph::contains((address)this), "is in the metaspace");
   378   assert(ClassLoaderDataGraph::contains((address)this), "is in the metaspace");
       
   379 
       
   380 #ifdef ASSERT
   396   // The class is alive iff the class loader is alive.
   381   // The class is alive iff the class loader is alive.
   397   oop loader = class_loader();
   382   oop loader = class_loader();
   398   return (loader == NULL) || is_alive->do_object_b(loader);
   383   bool loader_alive = (loader == NULL) || is_alive->do_object_b(loader);
       
   384 #endif // ASSERT
       
   385 
       
   386   // The class is alive if it's mirror is alive (which should be marked if the
       
   387   // loader is alive) unless it's an anoymous class.
       
   388   bool mirror_alive = is_alive->do_object_b(java_mirror());
       
   389   assert(!mirror_alive || loader_alive, "loader must be alive if the mirror is"
       
   390                         " but not the other way around with anonymous classes");
       
   391   return mirror_alive;
   399 }
   392 }
   400 
   393 
   401 void Klass::clean_weak_klass_links(BoolObjectClosure* is_alive) {
   394 void Klass::clean_weak_klass_links(BoolObjectClosure* is_alive) {
   402   if (!ClassUnloading) {
   395   if (!ClassUnloading) {
   403     return;
   396     return;
   414 
   407 
   415     // Find and set the first alive subklass
   408     // Find and set the first alive subklass
   416     Klass* sub = current->subklass_oop();
   409     Klass* sub = current->subklass_oop();
   417     while (sub != NULL && !sub->is_loader_alive(is_alive)) {
   410     while (sub != NULL && !sub->is_loader_alive(is_alive)) {
   418 #ifndef PRODUCT
   411 #ifndef PRODUCT
   419         if (TraceClassUnloading && WizardMode) {
   412       if (TraceClassUnloading && WizardMode) {
   420           ResourceMark rm;
   413         ResourceMark rm;
   421         tty->print_cr("[Unlinking class (subclass) %s]", sub->external_name());
   414         tty->print_cr("[Unlinking class (subclass) %s]", sub->external_name());
   422         }
   415       }
   423 #endif
   416 #endif
   424       sub = sub->next_sibling_oop();
   417       sub = sub->next_sibling_oop();
   425     }
   418     }
   426     current->set_subklass(sub);
   419     current->set_subklass(sub);
   427     if (sub != NULL) {
   420     if (sub != NULL) {
   429     }
   422     }
   430 
   423 
   431     // Find and set the first alive sibling
   424     // Find and set the first alive sibling
   432     Klass* sibling = current->next_sibling_oop();
   425     Klass* sibling = current->next_sibling_oop();
   433     while (sibling != NULL && !sibling->is_loader_alive(is_alive)) {
   426     while (sibling != NULL && !sibling->is_loader_alive(is_alive)) {
   434           if (TraceClassUnloading && WizardMode) {
   427       if (TraceClassUnloading && WizardMode) {
   435             ResourceMark rm;
   428         ResourceMark rm;
   436         tty->print_cr("[Unlinking class (sibling) %s]", sibling->external_name());
   429         tty->print_cr("[Unlinking class (sibling) %s]", sibling->external_name());
   437           }
   430       }
   438       sibling = sibling->next_sibling_oop();
   431       sibling = sibling->next_sibling_oop();
   439       }
   432     }
   440     current->set_next_sibling(sibling);
   433     current->set_next_sibling(sibling);
   441     if (sibling != NULL) {
   434     if (sibling != NULL) {
   442       stack.push(sibling);
   435       stack.push(sibling);
   443 }
   436     }
   444 
   437 
   445     // Clean the implementors list and method data.
   438     // Clean the implementors list and method data.
   446     if (current->oop_is_instance()) {
   439     if (current->oop_is_instance()) {
   447       InstanceKlass* ik = InstanceKlass::cast(current);
   440       InstanceKlass* ik = InstanceKlass::cast(current);
   448       ik->clean_implementors_list(is_alive);
   441       ik->clean_implementors_list(is_alive);
   552 const char* Klass::external_name() const {
   545 const char* Klass::external_name() const {
   553   if (oop_is_instance()) {
   546   if (oop_is_instance()) {
   554     InstanceKlass* ik = (InstanceKlass*) this;
   547     InstanceKlass* ik = (InstanceKlass*) this;
   555     if (ik->is_anonymous()) {
   548     if (ik->is_anonymous()) {
   556       assert(EnableInvokeDynamic, "");
   549       assert(EnableInvokeDynamic, "");
   557       intptr_t hash = ik->java_mirror()->identity_hash();
   550       intptr_t hash = 0;
       
   551       if (ik->java_mirror() != NULL) {
       
   552         // java_mirror might not be created yet, return 0 as hash.
       
   553         hash = ik->java_mirror()->identity_hash();
       
   554       }
   558       char     hash_buf[40];
   555       char     hash_buf[40];
   559       sprintf(hash_buf, "/" UINTX_FORMAT, (uintx)hash);
   556       sprintf(hash_buf, "/" UINTX_FORMAT, (uintx)hash);
   560       size_t   hash_len = strlen(hash_buf);
   557       size_t   hash_len = strlen(hash_buf);
   561 
   558 
   562       size_t result_len = name()->utf8_length();
   559       size_t result_len = name()->utf8_length();