Skip to content

Commit cfcebde

Browse files
committed
Ensure classes from system modules are excluded from ReflectionInvocationCheck
1 parent 04990c7 commit cfcebde

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FallbackFeature.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.oracle.svm.core.util.VMError;
4747
import com.oracle.svm.hosted.FeatureImpl.AfterAnalysisAccessImpl;
4848
import com.oracle.svm.hosted.FeatureImpl.BeforeAnalysisAccessImpl;
49+
import com.oracle.svm.util.ModuleSupport;
4950

5051
import jdk.vm.ci.code.BytecodePosition;
5152
import jdk.vm.ci.meta.ResolvedJavaMethod;
@@ -62,6 +63,8 @@ public class FallbackFeature implements Feature {
6263
private final List<String> proxyCalls = new ArrayList<>();
6364
private final List<String> serializationCalls = new ArrayList<>();
6465

66+
private final Set<Object> systemModuleDescriptors = ModuleSupport.getSystemModuleDescriptors();
67+
6568
private static class AutoProxyInvoke {
6669
private final ResolvedJavaMethod method;
6770
private final int bci;
@@ -103,7 +106,7 @@ private interface InvokeChecker {
103106
void check(ReflectionInvocationCheck check, BytecodePosition invokeLocation);
104107
}
105108

106-
private static class ReflectionInvocationCheck {
109+
private class ReflectionInvocationCheck {
107110
private final Method reflectionMethod;
108111
private final InvokeChecker checker;
109112
private AnalysisMethod trackedReflectionMethod;
@@ -120,10 +123,15 @@ void trackMethod(AnalysisMetaAccess metaAccess) {
120123
}
121124

122125
void apply(BytecodePosition invokeLocation) {
123-
ClassLoader classLoader = ((AnalysisMethod) invokeLocation.getMethod()).getDeclaringClass().getJavaClass().getClassLoader();
124-
if (NativeImageSystemClassLoader.singleton().isNativeImageClassLoader(classLoader)) {
125-
checker.check(this, invokeLocation);
126+
Class<?> javaClass = ((AnalysisMethod) invokeLocation.getMethod()).getDeclaringClass().getJavaClass();
127+
if (systemModuleDescriptors.contains(ModuleSupport.getModuleDescriptor(javaClass))) {
128+
return;
129+
}
130+
ClassLoader classLoader = javaClass.getClassLoader();
131+
if (!NativeImageSystemClassLoader.singleton().isNativeImageClassLoader(classLoader)) {
132+
return;
126133
}
134+
checker.check(this, invokeLocation);
127135
}
128136

129137
String locationString(BytecodePosition invokeLocation) {

substratevm/src/com.oracle.svm.util.jdk11/src/com/oracle/svm/util/ModuleSupport.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@
2424
*/
2525
package com.oracle.svm.util;
2626

27+
import java.lang.module.ModuleFinder;
28+
import java.lang.module.ModuleReference;
2729
import java.util.NoSuchElementException;
2830
import java.util.Optional;
2931
import java.util.Set;
32+
import java.util.stream.Collectors;
3033

3134
import org.graalvm.nativeimage.Platform;
3235
import org.graalvm.nativeimage.Platforms;
@@ -124,4 +127,14 @@ public static void exportAndOpenPackageToUnnamed(String name, String pkg, boolea
124127
public static String getModuleName(Class<?> clazz) {
125128
return clazz.getModule().getName();
126129
}
130+
131+
public static Object getModuleDescriptor(Class<?> clazz) {
132+
return clazz.getModule().getDescriptor();
133+
}
134+
135+
public static Set<Object> getSystemModuleDescriptors() {
136+
return ModuleFinder.ofSystem().findAll().stream()
137+
.map(ModuleReference::descriptor)
138+
.collect(Collectors.toSet());
139+
}
127140
}

substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/ModuleSupport.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
*/
2525
package com.oracle.svm.util;
2626

27+
import java.util.Collections;
2728
import java.util.NoSuchElementException;
29+
import java.util.Set;
2830

2931
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
3032
import org.graalvm.nativeimage.Platform;
@@ -86,4 +88,14 @@ public static String getModuleName(Class<?> clazz) {
8688
assert JavaVersionUtil.JAVA_SPEC <= 8;
8789
return null;
8890
}
91+
92+
public static Object getModuleDescriptor(Class<?> clazz) {
93+
assert JavaVersionUtil.JAVA_SPEC <= 8;
94+
return null;
95+
}
96+
97+
public static Set<Object> getSystemModuleDescriptors() {
98+
assert JavaVersionUtil.JAVA_SPEC <= 8;
99+
return Collections.emptySet();
100+
}
89101
}

0 commit comments

Comments
 (0)