< 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 >