From 38cd860daa9504bbe5add8c2d045d78c75fb7e38 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Wed, 23 Jul 2025 14:48:49 +0000 Subject: [PATCH] 8363816: Refactor array name creation Reviewed-by: shade, ccheung, dholmes --- src/hotspot/share/oops/objArrayKlass.cpp | 40 +++++++++++++----------- src/hotspot/share/oops/objArrayKlass.hpp | 5 +++ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/hotspot/share/oops/objArrayKlass.cpp b/src/hotspot/share/oops/objArrayKlass.cpp index e1fcc25f150..48d56ddc540 100644 --- a/src/hotspot/share/oops/objArrayKlass.cpp +++ b/src/hotspot/share/oops/objArrayKlass.cpp @@ -53,6 +53,26 @@ ObjArrayKlass* ObjArrayKlass::allocate_klass(ClassLoaderData* loader_data, int n return new (loader_data, size, THREAD) ObjArrayKlass(n, k, name); } +Symbol* ObjArrayKlass::create_element_klass_array_name(JavaThread* current, Klass* element_klass) { + ResourceMark rm(current); + char* name_str = element_klass->name()->as_C_string(); + int len = element_klass->name()->utf8_length(); + char* new_str = NEW_RESOURCE_ARRAY_IN_THREAD(current, char, len + 4); + int idx = 0; + new_str[idx++] = JVM_SIGNATURE_ARRAY; + if (element_klass->is_instance_klass()) { // it could be an array or simple type + new_str[idx++] = JVM_SIGNATURE_CLASS; + } + memcpy(&new_str[idx], name_str, len * sizeof(char)); + idx += len; + if (element_klass->is_instance_klass()) { + new_str[idx++] = JVM_SIGNATURE_ENDCLASS; + } + new_str[idx] = '\0'; + return SymbolTable::new_symbol(new_str); +} + + ObjArrayKlass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data, int n, Klass* element_klass, TRAPS) { @@ -79,25 +99,7 @@ ObjArrayKlass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_da } // Create type name for klass. - Symbol* name = nullptr; - { - ResourceMark rm(THREAD); - char *name_str = element_klass->name()->as_C_string(); - int len = element_klass->name()->utf8_length(); - char *new_str = NEW_RESOURCE_ARRAY(char, len + 4); - int idx = 0; - new_str[idx++] = JVM_SIGNATURE_ARRAY; - if (element_klass->is_instance_klass()) { // it could be an array or simple type - new_str[idx++] = JVM_SIGNATURE_CLASS; - } - memcpy(&new_str[idx], name_str, len * sizeof(char)); - idx += len; - if (element_klass->is_instance_klass()) { - new_str[idx++] = JVM_SIGNATURE_ENDCLASS; - } - new_str[idx++] = '\0'; - name = SymbolTable::new_symbol(new_str); - } + Symbol* name = create_element_klass_array_name(THREAD, element_klass); // Initialize instance variables ObjArrayKlass* oak = ObjArrayKlass::allocate_klass(loader_data, n, element_klass, name, CHECK_NULL); diff --git a/src/hotspot/share/oops/objArrayKlass.hpp b/src/hotspot/share/oops/objArrayKlass.hpp index 11fe4f2a521..6db6630cff4 100644 --- a/src/hotspot/share/oops/objArrayKlass.hpp +++ b/src/hotspot/share/oops/objArrayKlass.hpp @@ -52,6 +52,11 @@ class ObjArrayKlass : public ArrayKlass { static ObjArrayKlass* allocate_klass(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS); objArrayOop allocate_instance(int length, TRAPS); + + protected: + // Create array_name for element klass + static Symbol* create_element_klass_array_name(JavaThread* current, Klass* element_klass); + public: // For dummy objects ObjArrayKlass() {}