From e8ffceb0d38cf500cac0dde110d101b0752a9d98 Mon Sep 17 00:00:00 2001 From: Ehren Julien-Neitzert Date: Thu, 2 Mar 2023 14:23:52 -0500 Subject: [PATCH] Fix Q types in lambda signature generation Correctly generate method signatures for lambda functions that take Q type arguments For #13182 (fixes error in WithFieldAccessorTest) Signed-off-by: Ehren Julien-Neitzert --- .../java.base/share/classes/java/lang/Access.java | 6 +++--- .../common/java_lang_invoke_MethodHandleNatives.cpp | 12 ++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/jcl/src/java.base/share/classes/java/lang/Access.java b/jcl/src/java.base/share/classes/java/lang/Access.java index b595ec998fc..cd3bd2090d5 100644 --- a/jcl/src/java.base/share/classes/java/lang/Access.java +++ b/jcl/src/java.base/share/classes/java/lang/Access.java @@ -386,7 +386,7 @@ public String newStringUTF8NoRepl(byte[] bytes, int offset, int length) { /*[IF JAVA_SPEC_VERSION < 17]*/ return StringCoding.newStringUTF8NoRepl(bytes, offset, length); /*[ELSE] JAVA_SPEC_VERSION < 17 */ - /*[IF JAVA_SPEC_VERSION < 21]*/ + /*[IF (JAVA_SPEC_VERSION < 21) | INLINE-TYPES]*/ return String.newStringUTF8NoRepl(bytes, offset, length); /*[ELSE] JAVA_SPEC_VERSION < 21 */ return String.newStringUTF8NoRepl(bytes, offset, length, true); @@ -696,7 +696,7 @@ public void setCarrierThreadLocal(CarrierThreadLocal carrierThreadlocal, } /*[ENDIF] JAVA_SPEC_VERSION >= 19 */ -/*[IF JAVA_SPEC_VERSION >= 21]*/ +/*[IF (JAVA_SPEC_VERSION >= 21) & !INLINE-TYPES]*/ @Override public String getLoaderNameID(ClassLoader loader) { StringBuilder buffer = new StringBuilder(); @@ -714,7 +714,7 @@ public String getLoaderNameID(ClassLoader loader) { return buffer.toString(); } -/*[ENDIF] JAVA_SPEC_VERSION >= 21 */ +/*[ENDIF] (JAVA_SPEC_VERSION >= 21) & !INLINE-TYPES */ /*[IF INLINE-TYPES]*/ @Override diff --git a/runtime/jcl/common/java_lang_invoke_MethodHandleNatives.cpp b/runtime/jcl/common/java_lang_invoke_MethodHandleNatives.cpp index bc9e1a8e60d..a7c60096af0 100644 --- a/runtime/jcl/common/java_lang_invoke_MethodHandleNatives.cpp +++ b/runtime/jcl/common/java_lang_invoke_MethodHandleNatives.cpp @@ -270,7 +270,11 @@ getClassSignature(J9VMThread *currentThread, J9Class * clazz) if (J9ROMCLASS_IS_ARRAY(clazz->romClass)) { vm->internalVMFunctions->copyStringToUTF8Helper(currentThread, sigString, J9_STR_NULL_TERMINATE_RESULT | J9_STR_XLAT, 0, J9VMJAVALANGSTRING_LENGTH(currentThread, sigString), (U_8*)sig, utfLength); } else { - sig[0] = 'L'; + if (J9_IS_J9CLASS_PRIMITIVE_VALUETYPE(clazz)) { + sig[0] = 'Q'; + } else { + sig[0] = 'L'; + } vm->internalVMFunctions->copyStringToUTF8Helper(currentThread, sigString, J9_STR_XLAT, 0, J9VMJAVALANGSTRING_LENGTH(currentThread, sigString), (U_8*)(sig + 1), utfLength - 1); sig[utfLength - 2] = ';'; sig[utfLength - 1] = '\0'; @@ -306,7 +310,11 @@ getClassSignature(J9VMThread *currentThread, J9Class * clazz) } if (*name != '[') { - sig[i++] = 'L'; + if (J9_IS_J9CLASS_PRIMITIVE_VALUETYPE(myClass)) { + sig[i++] = 'Q'; + } else { + sig[i++] = 'L'; + } } memcpy(sig+i, name, nameLength);