mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 22:34:27 +02:00
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:
parent
642041adbc
commit
7cc1371059
198 changed files with 9526 additions and 1575 deletions
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue