--- old/src/hotspot/share/oops/klass.cpp 2020-03-26 15:59:24.000000000 -0700 +++ new/src/hotspot/share/oops/klass.cpp 2020-03-26 15:59:23.000000000 -0700 @@ -608,7 +608,7 @@ // gotten an OOM later but keep the mirror if it was created. if (java_mirror() == NULL) { log_trace(cds, mirror)("Recreate mirror for %s", external_name()); - java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, CHECK); + java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, Handle(), CHECK); } } @@ -672,6 +672,20 @@ } } +// Replace the last '+' char with '/'. +static char* convert_hidden_name_to_java(Symbol* name) { + size_t name_len = name->utf8_length(); + char* result = NEW_RESOURCE_ARRAY(char, name_len + 1); + name->as_klass_external_name(result, (int)name_len + 1); + for (int index = (int)name_len; index > 0; index--) { + if (result[index] == '+') { + result[index] = JVM_SIGNATURE_SLASH; + break; + } + } + return result; +} + // In product mode, this function doesn't have virtual function calls so // there might be some performance advantage to handling InstanceKlass here. const char* Klass::external_name() const { @@ -688,7 +702,14 @@ strcpy(result + name_len, addr_buf); assert(strlen(result) == name_len + addr_len, ""); return result; + + } else if (ik->is_hidden()) { + char* result = convert_hidden_name_to_java(name()); + return result; } + } else if (is_objArray_klass() && ObjArrayKlass::cast(this)->bottom_klass()->is_hidden()) { + char* result = convert_hidden_name_to_java(name()); + return result; } if (name() == NULL) return ""; return name()->as_klass_external_name(); @@ -696,6 +717,18 @@ const char* Klass::signature_name() const { if (name() == NULL) return ""; + if (is_objArray_klass() && ObjArrayKlass::cast(this)->bottom_klass()->is_hidden()) { + size_t name_len = name()->utf8_length(); + char* result = NEW_RESOURCE_ARRAY(char, name_len + 1); + name()->as_C_string(result, (int)name_len + 1); + for (int index = (int)name_len; index > 0; index--) { + if (result[index] == '+') { + result[index] = JVM_SIGNATURE_DOT; + break; + } + } + return result; + } return name()->as_C_string(); }