< prev index next >

src/hotspot/share/oops/klass.cpp

Print this page
rev 58565 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: duke
Contributed-by: mandy.chung@oracle.com, lois.foltan@oracle.com, david.holmes@oracle.com, harold.seigel@oracle.com, serguei.spitsyn@oracle.com, alex.buckley@oracle.com, jamsheed.c.m@oracle.com

*** 606,616 **** // Only recreate it if not present. A previous attempt to restore may have // 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); } } #if INCLUDE_CDS_JAVA_HEAP // Used at CDS dump time to access the archived mirror. No GC barrier. --- 606,616 ---- // Only recreate it if not present. A previous attempt to restore may have // 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, Handle(), CHECK); } } #if INCLUDE_CDS_JAVA_HEAP // Used at CDS dump time to access the archived mirror. No GC barrier.
*** 670,679 **** --- 670,693 ---- } else if (length < 0) { THROW_MSG(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length)); } } + // 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 { if (is_instance_klass()) { const InstanceKlass* ik = static_cast<const InstanceKlass*>(this);
*** 686,703 **** --- 700,736 ---- name()->as_klass_external_name(result, (int) name_len + 1); assert(strlen(result) == name_len, ""); 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 "<unknown>"; return name()->as_klass_external_name(); } const char* Klass::signature_name() const { if (name() == NULL) return "<unknown>"; + 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(); } const char* Klass::external_kind() const { if (is_interface()) return "interface";
< prev index next >