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