8238358: Implementation of JEP 371: Hidden Classes

Co-authored-by: Lois Foltan <lois.foltan@oracle.com>
Co-authored-by: David Holmes <david.holmes@oracle.com>
Co-authored-by: Harold Seigel <harold.seigel@oracle.com>
Co-authored-by: Serguei Spitsyn <serguei.spitsyn@oracle.com>
Co-authored-by: Alex Buckley <alex.buckley@oracle.com>
Co-authored-by: Jamsheed Mohammed C M <jamsheed.c.m@oracle.com>
Co-authored-by: Jan Lahoda <jan.lahoda@oracle.com>
Co-authored-by: Amy Lu <amy.lu@oracle.com>
Reviewed-by: alanb, cjplummer, coleenp, dholmes, dlong, forax, jlahoda, psandoz, plevart, sspitsyn, vromero
This commit is contained in:
Mandy Chung 2020-04-21 06:55:38 -07:00
parent 642041adbc
commit 7cc1371059
198 changed files with 9526 additions and 1575 deletions

View file

@ -608,7 +608,7 @@ void Klass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protec
// 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 @@ void Klass::check_array_allocation_length(int length, int max_length, TRAPS) {
}
}
// 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 @@ const char* Klass::external_name() const {
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();
@ -696,6 +717,18 @@ const char* Klass::external_name() const {
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();
}