|
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