< 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,11 +606,11 @@
// 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);
+ 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,10 +670,24 @@
} 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,18 +700,37 @@
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 >