|
56 | 56 | import java.util.stream.Collectors; |
57 | 57 | import java.util.stream.Stream; |
58 | 58 |
|
59 | | -import com.oracle.svm.core.jdk.RuntimeClassLoaderValueSupport; |
60 | | -import jdk.internal.module.ServicesCatalog; |
| 59 | +import jdk.internal.loader.ClassLoaders; |
61 | 60 | import org.graalvm.nativeimage.ImageSingletons; |
62 | 61 | import org.graalvm.nativeimage.Platform; |
63 | 62 | import org.graalvm.nativeimage.Platforms; |
|
72 | 71 | import com.oracle.svm.core.heap.UnknownObjectField; |
73 | 72 | import com.oracle.svm.core.hub.DynamicHub; |
74 | 73 | import com.oracle.svm.core.jdk.Resources; |
| 74 | +import com.oracle.svm.core.jdk.RuntimeClassLoaderValueSupport; |
75 | 75 | import com.oracle.svm.core.jdk.RuntimeModuleSupport; |
76 | 76 | import com.oracle.svm.core.util.VMError; |
77 | 77 | import com.oracle.svm.hosted.FeatureImpl.AfterAnalysisAccessImpl; |
|
84 | 84 | import jdk.internal.module.DefaultRoots; |
85 | 85 | import jdk.internal.module.ModuleBootstrap; |
86 | 86 | import jdk.internal.module.ModuleReferenceImpl; |
| 87 | +import jdk.internal.module.ServicesCatalog; |
87 | 88 | import jdk.internal.module.SystemModuleFinders; |
88 | 89 |
|
89 | 90 | /** |
@@ -226,9 +227,15 @@ public void afterAnalysis(AfterAnalysisAccess access) { |
226 | 227 | runtimeImageNamedModules.add((Module) module.get()); |
227 | 228 | }); |
228 | 229 |
|
| 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 | + */ |
229 | 235 | Set<Module> analysisReachableSyntheticModules = runtimeImageNamedModules |
230 | 236 | .stream() |
231 | 237 | .filter(ModuleLayerFeatureUtils::isModuleSynthetic) |
| 238 | + .filter(m -> m.getClassLoader() != accessImpl.imageClassLoader.getClassLoader()) |
232 | 239 | .collect(Collectors.toSet()); |
233 | 240 |
|
234 | 241 | /* |
@@ -256,7 +263,7 @@ public void afterAnalysis(AfterAnalysisAccess access) { |
256 | 263 | List<ModuleLayer> runtimeModuleLayers = synthesizeRuntimeModuleLayers(accessImpl, reachableModuleLayers, runtimeImageNamedModules, analysisReachableSyntheticModules, rootModules); |
257 | 264 | ModuleLayer runtimeBootLayer = runtimeModuleLayers.getFirst(); |
258 | 265 | RuntimeModuleSupport.instance().setBootLayer(runtimeBootLayer); |
259 | | - RuntimeClassLoaderValueSupport.instance().update(accessImpl.imageClassLoader.getClassLoader(), runtimeModuleLayers); |
| 266 | + RuntimeClassLoaderValueSupport.instance().update(runtimeModuleLayers); |
260 | 267 |
|
261 | 268 | /* |
262 | 269 | * 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, |
454 | 461 | runtimeModuleLayer = moduleLayerFeatureUtils.createNewModuleLayerInstance(runtimeModuleLayerConfiguration); |
455 | 462 | Map<String, Module> nameToModule = moduleLayerFeatureUtils.synthesizeNameToModule(accessImpl, runtimeModuleLayer, clf); |
456 | 463 | for (Module syntheticModule : syntheticModules) { |
457 | | - /* |
458 | | - * Ignore proxy modules where loader is imageClassLoader. |
459 | | - */ |
460 | | - if (syntheticModule.getClassLoader() == cl.getClassLoader()) { |
461 | | - continue; |
462 | | - } |
463 | 464 | Module runtimeSyntheticModule = moduleLayerFeatureUtils.getOrCreateRuntimeModuleForHostedModule(syntheticModule, accessImpl); |
464 | 465 | nameToModule.putIfAbsent(runtimeSyntheticModule.getName(), runtimeSyntheticModule); |
465 | 466 | moduleLayerFeatureUtils.patchModuleLayerField(accessImpl, runtimeSyntheticModule, runtimeModuleLayer); |
@@ -807,11 +808,24 @@ public ModuleFinder getAppModuleFinder() { |
807 | 808 | } |
808 | 809 | } |
809 | 810 |
|
| 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 | + |
810 | 823 | public Module getRuntimeModuleForHostedModule(Module hostedModule, boolean optional) { |
811 | 824 | return getRuntimeModuleForHostedModule(hostedModule.getClassLoader(), hostedModule.getName(), optional); |
812 | 825 | } |
813 | 826 |
|
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); |
815 | 829 | Map<String, Module> loaderRuntimeModules = runtimeModules.get(loader); |
816 | 830 | if (loaderRuntimeModules == null) { |
817 | 831 | if (optional) { |
@@ -847,8 +861,9 @@ public Module getOrCreateRuntimeModuleForHostedModule(Module hostedModule, Analy |
847 | 861 | } |
848 | 862 | } |
849 | 863 |
|
850 | | - public Module getOrCreateRuntimeModuleForHostedModule(ClassLoader loader, String hostedModuleName, ModuleDescriptor runtimeModuleDescriptor, AnalysisAccessBase access, |
| 864 | + public Module getOrCreateRuntimeModuleForHostedModule(ClassLoader hostedLoader, String hostedModuleName, ModuleDescriptor runtimeModuleDescriptor, AnalysisAccessBase access, |
851 | 865 | boolean enableNativeAccess) { |
| 866 | + ClassLoader loader = getRuntimeLoaderFor(hostedLoader); |
852 | 867 | synchronized (runtimeModules) { |
853 | 868 | Module runtimeModule = getRuntimeModuleForHostedModule(loader, hostedModuleName, true); |
854 | 869 | if (runtimeModule != null) { |
|
0 commit comments