--- old/src/hotspot/share/classfile/javaClasses.cpp 2018-06-13 19:36:59.950143961 -0400 +++ new/src/hotspot/share/classfile/javaClasses.cpp 2018-06-13 19:36:58.455675555 -0400 @@ -3993,6 +3993,7 @@ 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) { @@ -4008,6 +4009,7 @@ #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) @@ -4033,11 +4035,20 @@ return loader->obj_field(parent_offset); } +// Returns the name of this class loader or null if this class loader is not named. oop java_lang_ClassLoader::name(oop loader) { assert(is_instance(loader), "loader must be oop"); return loader->obj_field(name_offset); } +// If the defining loader has a name explicitly set then '' @ +// If the defining loader has no name then @ +// If built-in loader, then omit '@' as there is only one instance. +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"); @@ -4111,39 +4122,28 @@ // 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(); + + // bootstrap loader if (loader == NULL) { - return ""; + return name; } 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 = ""; - } - stringStream ss; - ss.print("\"%s\" (instance of %s", name, loader->klass()->external_name()); + 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); + ClassLoaderData *pl_cld = ClassLoaderData::class_loader_data(pl); + const char* parentName = pl_cld->loader_name(); 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 = ""; - } - ss.print(", child of \"%s\" %s", parentName, pl->klass()->external_name()); + ss.print(", child of %s %s", parentName, pl->klass()->external_name()); } else { - ss.print(", child of "); + // bootstrap loader + ss.print(", child of %s", parentName); } } ss.print(")");