Skip to content

Commit 21a6dca

Browse files
committed
Ensure builder class loader is patched in runtime modules
1 parent a1eb5d5 commit 21a6dca

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/RuntimeClassLoaderValueSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public static RuntimeClassLoaderValueSupport instance() {
8181
ClassLoaderValue<List<ModuleLayer>> moduleLayerCLV = new ClassLoaderValue<>();
8282

8383
@Platforms(Platform.HOSTED_ONLY.class) //
84-
public void update(ClassLoader imageClassLoader, List<ModuleLayer> runtimeModuleLayers) {
84+
public void update(List<ModuleLayer> runtimeModuleLayers) {
8585
for (ModuleLayer runtimeLayer : runtimeModuleLayers) {
8686
Set<ClassLoader> loaders = runtimeLayer.modules().stream()
8787
.map(Module::getClassLoader)

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

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@
5656
import java.util.stream.Collectors;
5757
import java.util.stream.Stream;
5858

59-
import com.oracle.svm.core.jdk.RuntimeClassLoaderValueSupport;
60-
import jdk.internal.module.ServicesCatalog;
59+
import jdk.internal.loader.ClassLoaders;
6160
import org.graalvm.nativeimage.ImageSingletons;
6261
import org.graalvm.nativeimage.Platform;
6362
import org.graalvm.nativeimage.Platforms;
@@ -72,6 +71,7 @@
7271
import com.oracle.svm.core.heap.UnknownObjectField;
7372
import com.oracle.svm.core.hub.DynamicHub;
7473
import com.oracle.svm.core.jdk.Resources;
74+
import com.oracle.svm.core.jdk.RuntimeClassLoaderValueSupport;
7575
import com.oracle.svm.core.jdk.RuntimeModuleSupport;
7676
import com.oracle.svm.core.util.VMError;
7777
import com.oracle.svm.hosted.FeatureImpl.AfterAnalysisAccessImpl;
@@ -84,6 +84,7 @@
8484
import jdk.internal.module.DefaultRoots;
8585
import jdk.internal.module.ModuleBootstrap;
8686
import jdk.internal.module.ModuleReferenceImpl;
87+
import jdk.internal.module.ServicesCatalog;
8788
import jdk.internal.module.SystemModuleFinders;
8889

8990
/**
@@ -226,9 +227,15 @@ public void afterAnalysis(AfterAnalysisAccess access) {
226227
runtimeImageNamedModules.add((Module) module.get());
227228
});
228229

230+
/*
231+
* We need to include synthetic modules in the runtime module system. Some modules, such as
232+
* jdk.proxy, are created for all class loaders, so we need to make sure to not include
233+
* those made for the builder class loader.
234+
*/
229235
Set<Module> analysisReachableSyntheticModules = runtimeImageNamedModules
230236
.stream()
231237
.filter(ModuleLayerFeatureUtils::isModuleSynthetic)
238+
.filter(m -> m.getClassLoader() != accessImpl.imageClassLoader.getClassLoader())
232239
.collect(Collectors.toSet());
233240

234241
/*
@@ -256,7 +263,7 @@ public void afterAnalysis(AfterAnalysisAccess access) {
256263
List<ModuleLayer> runtimeModuleLayers = synthesizeRuntimeModuleLayers(accessImpl, reachableModuleLayers, runtimeImageNamedModules, analysisReachableSyntheticModules, rootModules);
257264
ModuleLayer runtimeBootLayer = runtimeModuleLayers.getFirst();
258265
RuntimeModuleSupport.instance().setBootLayer(runtimeBootLayer);
259-
RuntimeClassLoaderValueSupport.instance().update(accessImpl.imageClassLoader.getClassLoader(), runtimeModuleLayers);
266+
RuntimeClassLoaderValueSupport.instance().update(runtimeModuleLayers);
260267

261268
/*
262269
* Ensure that runtime modules have the same relations (i.e., reads, opens and exports) as
@@ -454,12 +461,6 @@ private ModuleLayer synthesizeRuntimeModuleLayer(List<ModuleLayer> parentLayers,
454461
runtimeModuleLayer = moduleLayerFeatureUtils.createNewModuleLayerInstance(runtimeModuleLayerConfiguration);
455462
Map<String, Module> nameToModule = moduleLayerFeatureUtils.synthesizeNameToModule(accessImpl, runtimeModuleLayer, clf);
456463
for (Module syntheticModule : syntheticModules) {
457-
/*
458-
* Ignore proxy modules where loader is imageClassLoader.
459-
*/
460-
if (syntheticModule.getClassLoader() == cl.getClassLoader()) {
461-
continue;
462-
}
463464
Module runtimeSyntheticModule = moduleLayerFeatureUtils.getOrCreateRuntimeModuleForHostedModule(syntheticModule, accessImpl);
464465
nameToModule.putIfAbsent(runtimeSyntheticModule.getName(), runtimeSyntheticModule);
465466
moduleLayerFeatureUtils.patchModuleLayerField(accessImpl, runtimeSyntheticModule, runtimeModuleLayer);
@@ -807,11 +808,24 @@ public ModuleFinder getAppModuleFinder() {
807808
}
808809
}
809810

811+
private ClassLoader getRuntimeLoaderFor(ClassLoader hostedLoader) {
812+
/*
813+
* Make sure to replace builder class loader with the application class loader. This is
814+
* the case, for example, for library support modules.
815+
*/
816+
if (hostedLoader == imageClassLoader.getClassLoader()) {
817+
return ClassLoaders.appClassLoader();
818+
} else {
819+
return hostedLoader;
820+
}
821+
}
822+
810823
public Module getRuntimeModuleForHostedModule(Module hostedModule, boolean optional) {
811824
return getRuntimeModuleForHostedModule(hostedModule.getClassLoader(), hostedModule.getName(), optional);
812825
}
813826

814-
public Module getRuntimeModuleForHostedModule(ClassLoader loader, String hostedModuleName, boolean optional) {
827+
public Module getRuntimeModuleForHostedModule(ClassLoader hostedLoader, String hostedModuleName, boolean optional) {
828+
ClassLoader loader = getRuntimeLoaderFor(hostedLoader);
815829
Map<String, Module> loaderRuntimeModules = runtimeModules.get(loader);
816830
if (loaderRuntimeModules == null) {
817831
if (optional) {
@@ -847,8 +861,9 @@ public Module getOrCreateRuntimeModuleForHostedModule(Module hostedModule, Analy
847861
}
848862
}
849863

850-
public Module getOrCreateRuntimeModuleForHostedModule(ClassLoader loader, String hostedModuleName, ModuleDescriptor runtimeModuleDescriptor, AnalysisAccessBase access,
864+
public Module getOrCreateRuntimeModuleForHostedModule(ClassLoader hostedLoader, String hostedModuleName, ModuleDescriptor runtimeModuleDescriptor, AnalysisAccessBase access,
851865
boolean enableNativeAccess) {
866+
ClassLoader loader = getRuntimeLoaderFor(hostedLoader);
852867
synchronized (runtimeModules) {
853868
Module runtimeModule = getRuntimeModuleForHostedModule(loader, hostedModuleName, true);
854869
if (runtimeModule != null) {

0 commit comments

Comments
 (0)