< prev index next >

src/hotspot/share/oops/klass.cpp

Print this page




 589     log_debug(cds, mirror)("%s has raw archived mirror", external_name());
 590     if (HeapShared::open_archive_heap_region_mapped()) {
 591       bool present = java_lang_Class::restore_archived_mirror(this, loader, module_handle,
 592                                                               protection_domain,
 593                                                               CHECK);
 594       if (present) {
 595         return;
 596       }
 597     }
 598 
 599     // No archived mirror data
 600     log_debug(cds, mirror)("No archived mirror data for %s", external_name());
 601     _java_mirror = NULL;
 602     this->clear_has_raw_archived_mirror();
 603   }
 604 
 605   // Only recreate it if not present.  A previous attempt to restore may have
 606   // gotten an OOM later but keep the mirror if it was created.
 607   if (java_mirror() == NULL) {
 608     log_trace(cds, mirror)("Recreate mirror for %s", external_name());
 609     java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, CHECK);
 610   }
 611 }
 612 
 613 #if INCLUDE_CDS_JAVA_HEAP
 614 // Used at CDS dump time to access the archived mirror. No GC barrier.
 615 oop Klass::archived_java_mirror_raw() {
 616   assert(has_raw_archived_mirror(), "must have raw archived mirror");
 617   return CompressedOops::decode(_archived_mirror);
 618 }
 619 
 620 narrowOop Klass::archived_java_mirror_raw_narrow() {
 621   assert(has_raw_archived_mirror(), "must have raw archived mirror");
 622   return _archived_mirror;
 623 }
 624 
 625 // No GC barrier
 626 void Klass::set_archived_java_mirror_raw(oop m) {
 627   assert(DumpSharedSpaces, "called only during runtime");
 628   _archived_mirror = CompressedOops::encode(m);
 629 }


 669     THROW_MSG(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length));
 670   }
 671 }
 672 
 673 // In product mode, this function doesn't have virtual function calls so
 674 // there might be some performance advantage to handling InstanceKlass here.
 675 const char* Klass::external_name() const {
 676   if (is_instance_klass()) {
 677     const InstanceKlass* ik = static_cast<const InstanceKlass*>(this);
 678     if (ik->is_unsafe_anonymous()) {
 679       char addr_buf[20];
 680       jio_snprintf(addr_buf, 20, "/" INTPTR_FORMAT, p2i(ik));
 681       size_t addr_len = strlen(addr_buf);
 682       size_t name_len = name()->utf8_length();
 683       char*  result   = NEW_RESOURCE_ARRAY(char, name_len + addr_len + 1);
 684       name()->as_klass_external_name(result, (int) name_len + 1);
 685       assert(strlen(result) == name_len, "");
 686       strcpy(result + name_len, addr_buf);
 687       assert(strlen(result) == name_len + addr_len, "");
 688       return result;













 689     }
 690   }
 691   if (name() == NULL)  return "<unknown>";
 692   return name()->as_klass_external_name();
 693 }
 694 
 695 const char* Klass::signature_name() const {
 696   if (name() == NULL)  return "<unknown>";
 697   return name()->as_C_string();
 698 }
 699 
 700 const char* Klass::external_kind() const {
 701   if (is_interface()) return "interface";
 702   if (is_abstract()) return "abstract class";
 703   return "class";
 704 }
 705 
 706 // Unless overridden, modifier_flags is 0.
 707 jint Klass::compute_modifier_flags(TRAPS) const {
 708   return 0;




 589     log_debug(cds, mirror)("%s has raw archived mirror", external_name());
 590     if (HeapShared::open_archive_heap_region_mapped()) {
 591       bool present = java_lang_Class::restore_archived_mirror(this, loader, module_handle,
 592                                                               protection_domain,
 593                                                               CHECK);
 594       if (present) {
 595         return;
 596       }
 597     }
 598 
 599     // No archived mirror data
 600     log_debug(cds, mirror)("No archived mirror data for %s", external_name());
 601     _java_mirror = NULL;
 602     this->clear_has_raw_archived_mirror();
 603   }
 604 
 605   // Only recreate it if not present.  A previous attempt to restore may have
 606   // gotten an OOM later but keep the mirror if it was created.
 607   if (java_mirror() == NULL) {
 608     log_trace(cds, mirror)("Recreate mirror for %s", external_name());
 609     java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, Handle(), CHECK);
 610   }
 611 }
 612 
 613 #if INCLUDE_CDS_JAVA_HEAP
 614 // Used at CDS dump time to access the archived mirror. No GC barrier.
 615 oop Klass::archived_java_mirror_raw() {
 616   assert(has_raw_archived_mirror(), "must have raw archived mirror");
 617   return CompressedOops::decode(_archived_mirror);
 618 }
 619 
 620 narrowOop Klass::archived_java_mirror_raw_narrow() {
 621   assert(has_raw_archived_mirror(), "must have raw archived mirror");
 622   return _archived_mirror;
 623 }
 624 
 625 // No GC barrier
 626 void Klass::set_archived_java_mirror_raw(oop m) {
 627   assert(DumpSharedSpaces, "called only during runtime");
 628   _archived_mirror = CompressedOops::encode(m);
 629 }


 669     THROW_MSG(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length));
 670   }
 671 }
 672 
 673 // In product mode, this function doesn't have virtual function calls so
 674 // there might be some performance advantage to handling InstanceKlass here.
 675 const char* Klass::external_name() const {
 676   if (is_instance_klass()) {
 677     const InstanceKlass* ik = static_cast<const InstanceKlass*>(this);
 678     if (ik->is_unsafe_anonymous()) {
 679       char addr_buf[20];
 680       jio_snprintf(addr_buf, 20, "/" INTPTR_FORMAT, p2i(ik));
 681       size_t addr_len = strlen(addr_buf);
 682       size_t name_len = name()->utf8_length();
 683       char*  result   = NEW_RESOURCE_ARRAY(char, name_len + addr_len + 1);
 684       name()->as_klass_external_name(result, (int) name_len + 1);
 685       assert(strlen(result) == name_len, "");
 686       strcpy(result + name_len, addr_buf);
 687       assert(strlen(result) == name_len + addr_len, "");
 688       return result;
 689 
 690     } else if (ik->is_hidden()) {
 691       // Replace the last '+' char with '/'.
 692       size_t name_len = name()->utf8_length();
 693       char* result = NEW_RESOURCE_ARRAY(char, name_len + 1);
 694       name()->as_klass_external_name(result, (int)name_len + 1);
 695       for (int index = (int)name_len; index > 0; index--) {
 696         if (result[index] == '+') {
 697           result[index] = '/';
 698           break;
 699         }
 700       }
 701       return result;
 702     }
 703   }
 704   if (name() == NULL)  return "<unknown>";
 705   return name()->as_klass_external_name();
 706 }
 707 
 708 const char* Klass::signature_name() const {
 709   if (name() == NULL)  return "<unknown>";
 710   return name()->as_C_string();
 711 }
 712 
 713 const char* Klass::external_kind() const {
 714   if (is_interface()) return "interface";
 715   if (is_abstract()) return "abstract class";
 716   return "class";
 717 }
 718 
 719 // Unless overridden, modifier_flags is 0.
 720 jint Klass::compute_modifier_flags(TRAPS) const {
 721   return 0;


< prev index next >