< prev index next >
src/hotspot/share/classfile/javaClasses.cpp
Print this page
*** 3991,4000 ****
--- 3991,4001 ----
bool java_lang_ClassLoader::offsets_computed = false;
int java_lang_ClassLoader::_loader_data_offset = -1;
int java_lang_ClassLoader::parallelCapable_offset = -1;
int java_lang_ClassLoader::name_offset = -1;
+ int java_lang_ClassLoader::nameAndId_offset = -1;
int java_lang_ClassLoader::unnamedModule_offset = -1;
ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) {
assert(loader != NULL && oopDesc::is_oop(loader), "loader must be oop");
return HeapAccess<>::load_at(loader, _loader_data_offset);
*** 4006,4015 ****
--- 4007,4017 ----
}
#define CLASSLOADER_FIELDS_DO(macro) \
macro(parallelCapable_offset, k1, "parallelLockMap", concurrenthashmap_signature, false); \
macro(name_offset, k1, vmSymbols::name_name(), string_signature, false); \
+ macro(nameAndId_offset, k1, "nameAndId", string_signature, false); \
macro(unnamedModule_offset, k1, "unnamedModule", module_signature, false); \
macro(parent_offset, k1, "parent", classloader_signature, false)
void java_lang_ClassLoader::compute_offsets() {
assert(!offsets_computed, "offsets should be initialized only once");
*** 4031,4045 ****
--- 4033,4060 ----
oop java_lang_ClassLoader::parent(oop loader) {
assert(is_instance(loader), "loader must be oop");
return loader->obj_field(parent_offset);
}
+ // Returns the name field of this class loader. If the name field has not
+ // been set, null will be returned.
oop java_lang_ClassLoader::name(oop loader) {
assert(is_instance(loader), "loader must be oop");
return loader->obj_field(name_offset);
}
+ // Returns the nameAndId field of this class loader. The format is
+ // as follows:
+ // If the defining loader has a name explicitly set then '<loader-name>' @<id>
+ // If the defining loader has no name then <qualified-class-name> @<id>
+ // If built-in loader, then omit '@<id>' as there is only one instance.
+ // Use ClassLoader::loader_name_id() to obtain this String as a char*.
+ oop java_lang_ClassLoader::nameAndId(oop loader) {
+ assert(is_instance(loader), "loader must be oop");
+ return loader->obj_field(nameAndId_offset);
+ }
+
bool java_lang_ClassLoader::isAncestor(oop loader, oop cl) {
assert(is_instance(loader), "loader must be oop");
assert(cl == NULL || is_instance(cl), "cl argument must be oop");
oop acl = loader;
debug_only(jint loop_count = 0);
*** 4109,4151 ****
return loader->obj_field(unnamedModule_offset);
}
// Caller needs ResourceMark.
const char* java_lang_ClassLoader::describe_external(const oop loader) {
if (loader == NULL) {
! return "<bootstrap>";
}
bool well_known_loader = SystemDictionary::is_system_class_loader(loader) ||
SystemDictionary::is_platform_class_loader(loader);
- const char* name = NULL;
- oop nameOop = java_lang_ClassLoader::name(loader);
- if (nameOop != NULL) {
- name = java_lang_String::as_utf8_string(nameOop);
- }
- if (name == NULL) {
- // Use placeholder for missing name to have fixed message format.
- name = "<unnamed>";
- }
-
stringStream ss;
! ss.print("\"%s\" (instance of %s", name, loader->klass()->external_name());
if (!well_known_loader) {
- const char* parentName = NULL;
oop pl = java_lang_ClassLoader::parent(loader);
if (pl != NULL) {
! oop parentNameOop = java_lang_ClassLoader::name(pl);
! if (parentNameOop != NULL) {
! parentName = java_lang_String::as_utf8_string(parentNameOop);
! }
! if (parentName == NULL) {
! parentName = "<unnamed>";
! }
! ss.print(", child of \"%s\" %s", parentName, pl->klass()->external_name());
} else {
! ss.print(", child of <bootstrap>");
}
}
ss.print(")");
return ss.as_string();
--- 4124,4155 ----
return loader->obj_field(unnamedModule_offset);
}
// Caller needs ResourceMark.
const char* java_lang_ClassLoader::describe_external(const oop loader) {
+ ClassLoaderData *cld = ClassLoaderData::class_loader_data(loader);
+ const char* name = cld->loader_name_and_id();
+
+ // bootstrap loader
if (loader == NULL) {
! return name;
}
bool well_known_loader = SystemDictionary::is_system_class_loader(loader) ||
SystemDictionary::is_platform_class_loader(loader);
stringStream ss;
! ss.print("%s (instance of %s", name, loader->klass()->external_name());
if (!well_known_loader) {
oop pl = java_lang_ClassLoader::parent(loader);
+ ClassLoaderData *pl_cld = ClassLoaderData::class_loader_data(pl);
+ const char* parentName = pl_cld->loader_name_and_id();
if (pl != NULL) {
! ss.print(", child of %s %s", parentName, pl->klass()->external_name());
} else {
! // bootstrap loader
! ss.print(", child of %s", parentName);
}
}
ss.print(")");
return ss.as_string();
< prev index next >