From d8fdac340e6e14bc0600d821ce775bdf01ad3059 Mon Sep 17 00:00:00 2001 From: David Beaumont Date: Fri, 19 Dec 2025 11:12:41 +0100 Subject: [PATCH] playing about with simpler buffer copying --- src/hotspot/share/cds/aotClassLocation.cpp | 3 +- src/hotspot/share/cds/filemap.cpp | 7 +--- src/hotspot/share/classfile/classLoader.cpp | 42 +++++++++++---------- src/hotspot/share/classfile/classLoader.hpp | 5 ++- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/hotspot/share/cds/aotClassLocation.cpp b/src/hotspot/share/cds/aotClassLocation.cpp index f77aac3540c..d5fae30fcf0 100644 --- a/src/hotspot/share/cds/aotClassLocation.cpp +++ b/src/hotspot/share/cds/aotClassLocation.cpp @@ -708,8 +708,7 @@ bool AOTClassLocationConfig::is_valid_classpath_index(int classpath_index, Insta JavaThread* current = JavaThread::current(); ResourceMark rm(current); const char* const class_name = ik->name()->as_C_string(); - const char* const file_name = ClassLoader::file_name_for_class_name(class_name, - ik->name()->utf8_length()); + const char* const file_name = ClassLoader::file_name_for_class_name(ik->name()); if (!zip->has_entry(current, file_name)) { aot_log_warning(aot)("class %s cannot be archived because it was not defined from %s as claimed", class_name, zip->name()); diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp index 3bb6175eb0d..a0560ed2ce4 100644 --- a/src/hotspot/share/cds/filemap.cpp +++ b/src/hotspot/share/cds/filemap.cpp @@ -2091,10 +2091,7 @@ ClassFileStream* FileMapInfo::open_stream_for_jvmti(InstanceKlass* ik, Handle cl ClassPathEntry* cpe = get_classpath_entry_for_jvmti(path_index, CHECK_NULL); assert(cpe != nullptr, "must be"); - Symbol* name = ik->name(); - const char* const class_name = name->as_C_string(); - const char* const file_name = ClassLoader::file_name_for_class_name(class_name, - name->utf8_length()); + const char* const file_name = ClassLoader::file_name_for_class_name(ik->name()); ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); const AOTClassLocation* cl = AOTClassLocationConfig::runtime()->class_location_at(path_index); ClassFileStream* cfs; @@ -2107,7 +2104,7 @@ ClassFileStream* FileMapInfo::open_stream_for_jvmti(InstanceKlass* ik, Handle cl cfs = cpe->open_stream_for_loader(THREAD, file_name, loader_data); } assert(cfs != nullptr, "must be able to read the classfile data of shared classes for built-in loaders."); - log_debug(aot, jvmti)("classfile data for %s [%d: %s] = %d bytes", class_name, path_index, + log_debug(aot, jvmti)("classfile data for %s [%d: %s] = %d bytes", file_name, path_index, cfs->source(), cfs->length()); return cfs; } diff --git a/src/hotspot/share/classfile/classLoader.cpp b/src/hotspot/share/classfile/classLoader.cpp index 691af1ce4e3..a473defccd1 100644 --- a/src/hotspot/share/classfile/classLoader.cpp +++ b/src/hotspot/share/classfile/classLoader.cpp @@ -986,21 +986,28 @@ objArrayOop ClassLoader::get_system_packages(TRAPS) { } // caller needs ResourceMark -const char* ClassLoader::file_name_for_class_name(const char* class_name, - int class_name_len) { +char* ClassLoader::symbol_name_to_padded_buffer(const Symbol* symbol, int padding_len) { + assert(symbol != nullptr, "invariant"); + assert(padding_len >= 0, "invariant"); + + // Include terminating nul. + int name_len = symbol->utf8_length() + 1; + char* const buffer = NEW_RESOURCE_ARRAY(char, name_len + padding_len); + symbol->as_C_string(buffer, name_len); + return buffer; +} + +// caller needs ResourceMark +const char* ClassLoader::file_name_for_class_name(const Symbol* class_name) { assert(class_name != nullptr, "invariant"); - assert((int)strlen(class_name) == class_name_len, "invariant"); static const char class_suffix[] = ".class"; - size_t class_suffix_len = sizeof(class_suffix); - - char* const file_name = NEW_RESOURCE_ARRAY(char, - class_name_len + - class_suffix_len); // includes term null - - strncpy(file_name, class_name, class_name_len); - strncpy(&file_name[class_name_len], class_suffix, class_suffix_len); + static const int suffix_len = strlen(class_suffix); + // Just suffix length (a trailing nul is already accounted for in the copy). + char* const file_name = symbol_name_to_padded_buffer(class_name, suffix_len); + // Append over existing trailing nul, so need to copy a new one. + strncpy(&file_name[class_name->utf8_length()], class_suffix, suffix_len + 1); return file_name; } @@ -1081,14 +1088,11 @@ InstanceKlass* ClassLoader::load_class(Symbol* name, PackageEntry* pkg_entry, bo ResourceMark rm(THREAD); HandleMark hm(THREAD); - const char* const class_name = name->as_C_string(); - - EventMarkClassLoading m("Loading class %s", class_name); - - const char* const file_name = file_name_for_class_name(class_name, - name->utf8_length()); + const char* const file_name = file_name_for_class_name(name); assert(file_name != nullptr, "invariant"); + EventMarkClassLoading m("Loading class %s", file_name); + // Lookup stream for parsing .class file ClassFileStream* stream = nullptr; s2 classpath_index = 0; @@ -1347,9 +1351,7 @@ void ClassLoader::record_result(JavaThread* current, InstanceKlass* ik, assert(classpath_index == -1, "sanity"); } - const char* const class_name = ik->name()->as_C_string(); - const char* const file_name = file_name_for_class_name(class_name, - ik->name()->utf8_length()); + const char* const file_name = file_name_for_class_name(ik->name()); assert(file_name != nullptr, "invariant"); record_result_for_builtin_loader(checked_cast(classpath_index), ik, redefined); } diff --git a/src/hotspot/share/classfile/classLoader.hpp b/src/hotspot/share/classfile/classLoader.hpp index ede74801905..ce51e6acc47 100644 --- a/src/hotspot/share/classfile/classLoader.hpp +++ b/src/hotspot/share/classfile/classLoader.hpp @@ -247,8 +247,9 @@ class ClassLoader: AllStatic { // Canonicalizes path names, so strcmp will work properly. This is mainly // to avoid confusing the zip library static char* get_canonical_path(const char* orig, Thread* thread); - static const char* file_name_for_class_name(const char* class_name, - int class_name_len); + + static char* symbol_name_to_padded_buffer(const Symbol* symbol, int padding_len); + static const char* file_name_for_class_name(const Symbol* class_name); static PackageEntry* get_package_entry(Symbol* pkg_name, ClassLoaderData* loader_data); static int crc32(int crc, const char* buf, int len); static bool update_class_path_entry_list(JavaThread* current,