From 6e4ffe6cfb52d1a2832e79bc470a6bedbab2fff7 Mon Sep 17 00:00:00 2001 From: Vojin Jovanovic Date: Sat, 12 Jul 2025 13:22:50 +0200 Subject: [PATCH] Preserve array types up to dimension 2 --- .../hosted/image/PreserveOptionsSupport.java | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/PreserveOptionsSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/PreserveOptionsSupport.java index e84dab52ebf1..420c4364bc67 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/PreserveOptionsSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/PreserveOptionsSupport.java @@ -158,18 +158,12 @@ public static void registerPreservedClasses(NativeImageClassLoaderSupport classL * registration. */ classesToPreserve.forEach(c -> { - reflection.register(always, false, c); - - reflection.registerAllDeclaredFields(always, c); - reflection.registerAllDeclaredMethodsQuery(always, false, c); - reflection.registerAllDeclaredConstructorsQuery(always, false, c); - reflection.registerAllConstructorsQuery(always, false, c); - reflection.registerAllClassesQuery(always, c); - reflection.registerAllDeclaredClassesQuery(always, c); - reflection.registerAllNestMembersQuery(always, c); - reflection.registerAllPermittedSubclassesQuery(always, c); - reflection.registerAllRecordComponentsQuery(always, c); - reflection.registerAllSignersQuery(always, c); + registerType(reflection, c); + + /* Register array types for each type up to dimension 2 */ + Class arrayType = c.arrayType(); + registerType(reflection, arrayType); + registerType(reflection, arrayType.arrayType()); /* Register every single-interface proxy */ // GR-62293 can't register proxies from jdk modules. @@ -222,4 +216,20 @@ public static void registerPreservedClasses(NativeImageClassLoaderSupport classL reflection.registerClassLookup(always, className); } } + + private static void registerType(RuntimeReflectionSupport reflection, Class c) { + ConfigurationCondition always = ConfigurationCondition.alwaysTrue(); + reflection.register(always, false, c); + + reflection.registerAllDeclaredFields(always, c); + reflection.registerAllDeclaredMethodsQuery(always, false, c); + reflection.registerAllDeclaredConstructorsQuery(always, false, c); + reflection.registerAllConstructorsQuery(always, false, c); + reflection.registerAllClassesQuery(always, c); + reflection.registerAllDeclaredClassesQuery(always, c); + reflection.registerAllNestMembersQuery(always, c); + reflection.registerAllPermittedSubclassesQuery(always, c); + reflection.registerAllRecordComponentsQuery(always, c); + reflection.registerAllSignersQuery(always, c); + } }