From 429374bee6a332eb5224eb0e6072e4046bcc71c0 Mon Sep 17 00:00:00 2001 From: Loic Ottet Date: Tue, 1 Oct 2024 01:24:12 +0200 Subject: [PATCH] Consider all types as registered for JNI --- .../LegacyReflectionConfigurationParser.java | 2 +- .../configure/ReflectionConfigurationParser.java | 16 +++++++++++----- .../core/configure/ReflectionMetadataParser.java | 9 ++++----- .../oracle/svm/hosted/jni/JNIAccessFeature.java | 3 +++ .../svm/hosted/reflect/ReflectionFeature.java | 4 ++++ 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyReflectionConfigurationParser.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyReflectionConfigurationParser.java index a123418dc670d..f4c94039374a6 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyReflectionConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyReflectionConfigurationParser.java @@ -47,7 +47,7 @@ final class LegacyReflectionConfigurationParser extends ReflectionConfigur LegacyReflectionConfigurationParser(ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, boolean strictConfiguration, boolean printMissingElements, boolean treatAllNameEntriesAsType) { - super(conditionResolver, delegate, strictConfiguration, printMissingElements); + super(conditionResolver, delegate, strictConfiguration, printMissingElements, ""); this.treatAllNameEntriesAsType = treatAllNameEntriesAsType; } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParser.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParser.java index b4d9700814404..541872f3664d6 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParser.java @@ -47,14 +47,16 @@ public abstract class ReflectionConfigurationParser extends ConfigurationP protected final ConfigurationConditionResolver conditionResolver; protected final ReflectionConfigurationParserDelegate delegate; + protected final String combinedFileKey; private final boolean printMissingElements; public ReflectionConfigurationParser(ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, boolean strictConfiguration, - boolean printMissingElements) { + boolean printMissingElements, String combinedFileKey) { super(strictConfiguration); this.conditionResolver = conditionResolver; this.printMissingElements = printMissingElements; this.delegate = delegate; + this.combinedFileKey = combinedFileKey; } public static ReflectionConfigurationParser create(String combinedFileKey, boolean strictMetadata, @@ -76,8 +78,8 @@ protected void parseClassArray(List classes) { protected abstract void parseClass(EconomicMap data); protected void registerIfNotDefault(EconomicMap data, boolean defaultValue, T clazz, String propertyName, Runnable register) { - if (data.containsKey(propertyName)) { - RuntimeReflectionSupport.increaseCount(false); + if (data.containsKey(propertyName) && delegate.getClass().getName().contains("ReflectionRegistryAdapter")) { + RuntimeReflectionSupport.increaseCount(combinedFileKey.equals(REFLECTION_KEY)); } if (data.containsKey(propertyName) ? asBoolean(data.get(propertyName), propertyName) : defaultValue) { try { @@ -96,7 +98,9 @@ protected void parseFields(C condition, List fields, T clazz) { private void parseField(C condition, EconomicMap data, T clazz) { checkAttributes(data, "reflection field descriptor object", Collections.singleton("name"), Arrays.asList("allowWrite", "allowUnsafeAccess")); - RuntimeReflectionSupport.increaseCount(false); + if (delegate.getClass().getName().contains("ReflectionRegistryAdapter")) { + RuntimeReflectionSupport.increaseCount(combinedFileKey.equals(REFLECTION_KEY)); + } String fieldName = asString(data.get("name"), "name"); boolean allowWrite = data.containsKey("allowWrite") && asBoolean(data.get("allowWrite"), "allowWrite"); @@ -117,7 +121,9 @@ protected void parseMethods(C condition, boolean queriedOnly, List metho private void parseMethod(C condition, boolean queriedOnly, EconomicMap data, T clazz) { checkAttributes(data, "reflection method descriptor object", Collections.singleton("name"), Collections.singleton("parameterTypes")); - RuntimeReflectionSupport.increaseCount(false); + if (delegate.getClass().getName().contains("ReflectionRegistryAdapter")) { + RuntimeReflectionSupport.increaseCount(combinedFileKey.equals(REFLECTION_KEY)); + } String methodName = asString(data.get("name"), "name"); List methodParameterTypes = null; Object parameterTypes = data.get("parameterTypes"); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionMetadataParser.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionMetadataParser.java index 982588099e973..ca86881c2d942 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionMetadataParser.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionMetadataParser.java @@ -41,12 +41,9 @@ class ReflectionMetadataParser extends ReflectionConfigurationParser "allDeclaredConstructors", "allPublicConstructors", "allDeclaredMethods", "allPublicMethods", "allDeclaredFields", "allPublicFields", "methods", "fields", "unsafeAllocated"); - private final String combinedFileKey; - ReflectionMetadataParser(String combinedFileKey, ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, boolean strictConfiguration, boolean printMissingElements) { - super(conditionResolver, delegate, strictConfiguration, printMissingElements); - this.combinedFileKey = combinedFileKey; + super(conditionResolver, delegate, strictConfiguration, printMissingElements, combinedFileKey); } @Override @@ -60,7 +57,9 @@ public void parseAndRegister(Object json, URI origin) { @Override protected void parseClass(EconomicMap data) { checkAttributes(data, "reflection class descriptor object", List.of(TYPE_KEY), OPTIONAL_REFLECT_METADATA_ATTRS); - RuntimeReflectionSupport.increaseCount(false); + if (delegate.getClass().getName().contains("ReflectionRegistryAdapter")) { + RuntimeReflectionSupport.increaseCount(combinedFileKey.equals(REFLECTION_KEY)); + } Optional type = parseTypeContents(data.get(TYPE_KEY)); if (type.isEmpty()) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java index 1faf781e3323a..e987a16dac7dd 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java @@ -25,6 +25,7 @@ package com.oracle.svm.hosted.jni; import static com.oracle.svm.core.configure.ConfigurationParser.JNI_KEY; +import static com.oracle.svm.core.configure.ConfigurationParser.REFLECTION_KEY; import java.lang.reflect.Executable; import java.lang.reflect.Field; @@ -209,6 +210,8 @@ public void afterRegistration(AfterRegistrationAccess arg) { ClassInitializationSupport.singleton()); ReflectionConfigurationParser> parser = ConfigurationParserUtils.create(JNI_KEY, true, conditionResolver, runtimeSupport, null, access.getImageClassLoader()); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(parser, access.getImageClassLoader(), "JNI"); + ReflectionConfigurationParser> reflectParser = ConfigurationParserUtils.create(REFLECTION_KEY, true, conditionResolver, runtimeSupport, null, access.getImageClassLoader()); + loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(reflectParser, access.getImageClassLoader(), "Reflection"); ReflectionConfigurationParser> legacyParser = ConfigurationParserUtils.create(null, false, conditionResolver, runtimeSupport, null, access.getImageClassLoader()); loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurations(legacyParser, access.getImageClassLoader(), "JNI", diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java index 5d80ffe544e6a..9288d8005820f 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java @@ -24,6 +24,7 @@ */ package com.oracle.svm.hosted.reflect; +import static com.oracle.svm.core.configure.ConfigurationParser.JNI_KEY; import static com.oracle.svm.core.configure.ConfigurationParser.REFLECTION_KEY; import java.lang.invoke.MethodHandle; @@ -283,6 +284,9 @@ public void duringSetup(DuringSetupAccess a) { ReflectionConfigurationParser> parser = ConfigurationParserUtils.create(REFLECTION_KEY, true, conditionResolver, reflectionData, proxyRegistry, access.getImageClassLoader()); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(parser, access.getImageClassLoader(), "reflection"); + ReflectionConfigurationParser> jniParser = ConfigurationParserUtils.create(JNI_KEY, true, conditionResolver, reflectionData, proxyRegistry, + access.getImageClassLoader()); + loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(jniParser, access.getImageClassLoader(), "JNI"); ReflectionConfigurationParser> legacyParser = ConfigurationParserUtils.create(null, false, conditionResolver, reflectionData, proxyRegistry, access.getImageClassLoader()); loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurations(legacyParser, access.getImageClassLoader(), "reflection",