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(); |