diff --git a/src/share/vm/classfile/systemDictionary.cpp b/src/share/vm/classfile/systemDictionary.cpp --- a/src/share/vm/classfile/systemDictionary.cpp +++ b/src/share/vm/classfile/systemDictionary.cpp @@ -2909,6 +2909,6 @@ // caller needs ResourceMark const char* SystemDictionary::loader_name(const ClassLoaderData* loader_data) { - return (loader_data->class_loader() == NULL ? "" : - SystemDictionary::loader_name(loader_data->class_loader())); + const oop loader = loader_data->class_loader(); + return (loader == NULL ? "" : SystemDictionary::loader_name(loader)); } diff --git a/src/share/vm/runtime/sharedRuntime.cpp b/src/share/vm/runtime/sharedRuntime.cpp --- a/src/share/vm/runtime/sharedRuntime.cpp +++ b/src/share/vm/runtime/sharedRuntime.cpp @@ -1939,9 +1939,23 @@ return generate_class_cast_message(caster_klass, target_klass); } +const char* SharedRuntime::class_loader_name(oop loader) { + const char* class_loader_name = ""; + if (loader != NULL) { + oop class_loader_name_oop = java_lang_ClassLoader::name(loader); + if (class_loader_name_oop != NULL) { + class_loader_name = java_lang_String::as_utf8_string(class_loader_name_oop); + if (class_loader_name != NULL && class_loader_name[0] != '\0') { + return class_loader_name; + } + } + } + return NULL; +} + // The caller of class_loader_and_module_name() (or one of its callers) // must use a ResourceMark in order to correctly free the result. -const char* class_loader_and_module_name(Klass* klass) { +const char* SharedRuntime::class_loader_and_module_name(Klass* klass) { const char* delim = "/"; size_t delim_len = strlen(delim); @@ -1959,18 +1973,12 @@ assert(cld != NULL, "class_loader_data should not be NULL"); if (!cld->is_builtin_class_loader_data()) { // If not builtin, look for name - oop loader = klass->class_loader(); - if (loader != NULL) { - oop class_loader_name_oop = java_lang_ClassLoader::name(loader); - if (class_loader_name_oop != NULL) { - class_loader_name = java_lang_String::as_utf8_string(class_loader_name_oop); - if (class_loader_name != NULL && class_loader_name[0] != '\0') { + class_loader_name = SharedRuntime::class_loader_name(klass->class_loader()); + if (class_loader_name != NULL) { has_cl_name = true; msglen += strlen(class_loader_name) + delim_len; } } - } - } const char* module_name = ""; const char* version = ""; diff --git a/src/share/vm/runtime/sharedRuntime.hpp b/src/share/vm/runtime/sharedRuntime.hpp --- a/src/share/vm/runtime/sharedRuntime.hpp +++ b/src/share/vm/runtime/sharedRuntime.hpp @@ -288,6 +288,9 @@ // used by native wrappers to reenable yellow if overflow happened in native code static void reguard_yellow_pages(); + static const char* class_loader_name(oop loader); + static const char* class_loader_and_module_name(Klass* klass); + // Fill in the "X cannot be cast to a Y" message for ClassCastException // // @param thr the current thread