From 3a22916888d274272d744f537facaf5bc26ef1a0 Mon Sep 17 00:00:00 2001 From: Ehren Julien-Neitzert Date: Tue, 11 Oct 2022 16:59:03 -0400 Subject: [PATCH] Convert last slash in hidden/anonymous class signatures to period Signed-off-by: Ehren Julien-Neitzert --- runtime/jvmti/jvmtiClass.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/runtime/jvmti/jvmtiClass.c b/runtime/jvmti/jvmtiClass.c index 1ef66041b7c..81d2b4cd127 100644 --- a/runtime/jvmti/jvmtiClass.c +++ b/runtime/jvmti/jvmtiClass.c @@ -296,6 +296,21 @@ jvmtiGetClassLoaderClasses(jvmtiEnv* env, } +void fixHiddenOrAnonSignature(char* signature, UDATA signatureLength) { + if (signatureLength >= (ROM_ADDRESS_LENGTH + 2)) { + IDATA lastSeparatorIndex = signatureLength - (ROM_ADDRESS_LENGTH + 2); + + /* hidden/anon class names are generated from ROMClassBuilder::handleAnonClassName() and have 0x appended at the end */ + if ((ANON_CLASSNAME_CHARACTER_SEPARATOR == signature[lastSeparatorIndex]) + && ('0' == signature[lastSeparatorIndex+1]) + && ('x' == signature[lastSeparatorIndex+2]) + ) { + signature[lastSeparatorIndex] = '.'; + } + } +} + + jvmtiError JNICALL jvmtiGetClassSignature(jvmtiEnv* env, jclass klass, @@ -366,6 +381,10 @@ jvmtiGetClassSignature(jvmtiEnv* env, signature[arity] = 'L'; memcpy(signature + arity + 1, J9UTF8_DATA(utf), utfLength); signature[allocSize - 1] = ';'; + + if (J9ROMCLASS_IS_ANON_OR_HIDDEN(leafType->romClass)) { + fixHiddenOrAnonSignature(signature, allocSize); + } } signature[allocSize] = '\0'; } else { @@ -381,6 +400,10 @@ jvmtiGetClassSignature(jvmtiEnv* env, memcpy(signature + 1, J9UTF8_DATA(utf), utfLength); signature[utfLength + 1] = ';'; signature[utfLength + 2] = '\0'; + + if (J9ROMCLASS_IS_ANON_OR_HIDDEN(clazz->romClass)) { + fixHiddenOrAnonSignature(signature, utfLength + 2); + } } }