Skip to content

Commit 5c4b0fa

Browse files
committed
Make the reflection parser handle the case when JNI is disabled
1 parent f0d0195 commit 5c4b0fa

File tree

8 files changed

+16
-20
lines changed

8 files changed

+16
-20
lines changed

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyReflectionConfigurationParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,13 @@ protected void parseClass(EconomicMap<String, Object> data) {
8282
return;
8383
}
8484

85+
boolean jniAccessible = checkOption(ConfigurationParserOption.JNI_PARSER);
8586
/*
8687
* Even if primitives cannot be queried through Class.forName, they can be registered to
8788
* allow getDeclaredMethods() and similar bulk queries at run time.
8889
*/
8990
C condition = conditionResult.get();
90-
TypeResult<T> result = delegate.resolveType(condition, typeDescriptor, true);
91+
TypeResult<T> result = delegate.resolveType(condition, typeDescriptor, true, jniAccessible);
9192
if (!result.isPresent()) {
9293
handleMissingElement("Could not resolve " + typeDescriptor + " for reflection configuration.", result.getException());
9394
return;
@@ -97,7 +98,6 @@ protected void parseClass(EconomicMap<String, Object> data) {
9798
T clazz = result.get();
9899
delegate.registerType(conditionResult.get(), clazz);
99100

100-
boolean jniAccessible = checkOption(ConfigurationParserOption.JNI_PARSER);
101101
registerIfNotDefault(data, false, clazz, "allDeclaredConstructors", () -> delegate.registerDeclaredConstructors(condition, false, jniAccessible, clazz));
102102
registerIfNotDefault(data, false, clazz, "allPublicConstructors", () -> delegate.registerPublicConstructors(condition, false, jniAccessible, clazz));
103103
registerIfNotDefault(data, false, clazz, "allDeclaredMethods", () -> delegate.registerDeclaredMethods(condition, false, jniAccessible, clazz));

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,14 @@ protected void parseClassArray(List<Object> classes) {
8282

8383
protected abstract void parseClass(EconomicMap<String, Object> data);
8484

85-
protected boolean registerIfNotDefault(EconomicMap<String, Object> data, boolean defaultValue, T clazz, String propertyName, Runnable register) {
85+
protected void registerIfNotDefault(EconomicMap<String, Object> data, boolean defaultValue, T clazz, String propertyName, Runnable register) {
8686
if (data.containsKey(propertyName) ? asBoolean(data.get(propertyName), propertyName) : defaultValue) {
8787
try {
8888
register.run();
89-
return true;
9089
} catch (LinkageError e) {
9190
handleMissingElement("Could not register " + delegate.getTypeName(clazz) + ": " + propertyName + " for reflection.", e);
9291
}
9392
}
94-
return false;
9593
}
9694

9795
protected void parseFields(C condition, List<Object> fields, T clazz, boolean jniAccessible) {
@@ -165,7 +163,7 @@ private List<T> parseMethodParameters(T clazz, String methodName, List<Object> t
165163
List<T> result = new ArrayList<>();
166164
for (Object type : types) {
167165
String typeName = asString(type, "types");
168-
TypeResult<T> typeResult = delegate.resolveType(conditionResolver.alwaysTrue(), NamedConfigurationTypeDescriptor.fromJSONName(typeName), true);
166+
TypeResult<T> typeResult = delegate.resolveType(conditionResolver.alwaysTrue(), NamedConfigurationTypeDescriptor.fromJSONName(typeName), true, false);
169167
if (!typeResult.isPresent()) {
170168
handleMissingElement("Could not register method " + formatMethod(clazz, methodName) + " for reflection.", typeResult.getException());
171169
return null;

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParserDelegate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
public interface ReflectionConfigurationParserDelegate<C, T> {
3232

33-
TypeResult<T> resolveType(C condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives);
33+
TypeResult<T> resolveType(C condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives, boolean jniAccessible);
3434

3535
void registerType(C condition, T type);
3636

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionMetadataParser.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,13 @@ protected void parseClass(EconomicMap<String, Object> data) {
7171
}
7272
C condition = conditionResult.get();
7373

74+
boolean jniParser = checkOption(ConfigurationParserOption.JNI_PARSER);
75+
boolean typeJniAccessible = jniParser || data.get("jniAccessible") == Boolean.TRUE;
7476
/*
7577
* Even if primitives cannot be queried through Class.forName, they can be registered to
7678
* allow getDeclaredMethods() and similar bulk queries at run time.
7779
*/
78-
TypeResult<T> result = delegate.resolveType(condition, type.get(), true);
80+
TypeResult<T> result = delegate.resolveType(condition, type.get(), true, typeJniAccessible);
7981
if (!result.isPresent()) {
8082
handleMissingElement("Could not resolve " + type.get() + " for reflection configuration.", result.getException());
8183
return;
@@ -85,7 +87,6 @@ protected void parseClass(EconomicMap<String, Object> data) {
8587
T clazz = result.get();
8688
delegate.registerType(conditionResult.get(), clazz);
8789

88-
boolean jniParser = checkOption(ConfigurationParserOption.JNI_PARSER);
8990
delegate.registerDeclaredClasses(queryCondition, clazz);
9091
delegate.registerPublicClasses(queryCondition, clazz);
9192
if (!jniParser) {
@@ -101,12 +102,9 @@ protected void parseClass(EconomicMap<String, Object> data) {
101102
delegate.registerDeclaredFields(queryCondition, true, jniParser, clazz);
102103
delegate.registerPublicFields(queryCondition, true, jniParser, clazz);
103104

104-
boolean typeJniAccessible;
105-
if (jniParser) {
106-
typeJniAccessible = true;
107-
} else {
105+
if (!jniParser) {
108106
registerIfNotDefault(data, false, clazz, "serializable", () -> delegate.registerAsSerializable(condition, clazz));
109-
typeJniAccessible = registerIfNotDefault(data, false, clazz, "jniAccessible", () -> delegate.registerAsJniAccessed(condition, clazz));
107+
registerIfNotDefault(data, false, clazz, "jniAccessible", () -> delegate.registerAsJniAccessed(condition, clazz));
110108
}
111109

112110
registerIfNotDefault(data, false, clazz, "allDeclaredConstructors", () -> delegate.registerDeclaredConstructors(condition, false, typeJniAccessible, clazz));

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ParserConfigurationAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public ParserConfigurationAdapter(TypeConfiguration configuration) {
4242
}
4343

4444
@Override
45-
public TypeResult<ConfigurationType> resolveType(UnresolvedConfigurationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives) {
45+
public TypeResult<ConfigurationType> resolveType(UnresolvedConfigurationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives, boolean jniAccessible) {
4646
ConfigurationType type = configuration.get(condition, typeDescriptor);
4747
/*
4848
* The type is not immediately set with all elements included. These are added afterwards

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,14 @@ public void registerType(ConfigurationCondition condition, Class<?> type) {
6868
}
6969

7070
@Override
71-
public TypeResult<Class<?>> resolveType(ConfigurationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives) {
72-
TypeResult<Class<?>> result = super.resolveType(condition, typeDescriptor, allowPrimitives);
71+
public TypeResult<Class<?>> resolveType(ConfigurationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives, boolean jniAccessible) {
72+
TypeResult<Class<?>> result = super.resolveType(condition, typeDescriptor, allowPrimitives, jniAccessible);
7373
if (!result.isPresent() && typeDescriptor instanceof NamedConfigurationTypeDescriptor namedDescriptor) {
7474
Throwable classLookupException = result.getException();
7575
if (classLookupException instanceof LinkageError) {
7676
String reflectionName = ClassNameSupport.typeNameToReflectionName(namedDescriptor.name());
7777
reflectionSupport.registerClassLookupException(condition, reflectionName, classLookupException);
78-
} else if (throwMissingRegistrationErrors() && classLookupException instanceof ClassNotFoundException) {
78+
} else if (throwMissingRegistrationErrors() && jniAccessible & classLookupException instanceof ClassNotFoundException) {
7979
String jniName = ClassNameSupport.typeNameToJNIName(namedDescriptor.name());
8080
jniSupport.registerClassLookup(condition, jniName);
8181
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public void registerType(ConfigurationCondition condition, Class<?> type) {
7878
}
7979

8080
@Override
81-
public TypeResult<Class<?>> resolveType(ConfigurationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives) {
81+
public TypeResult<Class<?>> resolveType(ConfigurationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives, boolean jniAccessible) {
8282
switch (typeDescriptor.getDescriptorType()) {
8383
case NAMED -> {
8484
String reflectionName = ClassNameSupport.typeNameToReflectionName(((NamedConfigurationTypeDescriptor) typeDescriptor).name());

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ public void duringSetup(DuringSetupAccess a) {
294294
reflectionData.duringSetup(access.getMetaAccess(), aUniverse);
295295
RuntimeProxyCreationSupport proxyRegistry = ImageSingletons.lookup(RuntimeProxyCreationSupport.class);
296296
RuntimeSerializationSupport<ConfigurationCondition> serializationSupport = RuntimeSerializationSupport.singleton();
297-
RuntimeJNIAccessSupport jniSupport = ImageSingletons.lookup(RuntimeJNIAccessSupport.class);
297+
RuntimeJNIAccessSupport jniSupport = SubstrateOptions.JNI.getValue() ? ImageSingletons.lookup(RuntimeJNIAccessSupport.class) : null;
298298
ReflectionConfigurationParser<ConfigurationCondition, Class<?>> parser = ConfigurationParserUtils.create(ConfigurationFile.REFLECTION, true, conditionResolver, reflectionData, proxyRegistry,
299299
serializationSupport, jniSupport, access.getImageClassLoader());
300300
loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(parser, access.getImageClassLoader(), "reflection");

0 commit comments

Comments
 (0)