Skip to content

Commit bf73631

Browse files
committed
Create unnamed module counterparts in the runtime module graph
1 parent 9d02a10 commit bf73631

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

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

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,8 @@ private static final class ModuleLayerFeatureUtils {
609609
private final Set<Module> allUnnamedModuleSet;
610610
private final Module everyoneModule;
611611
private final Set<Module> everyoneSet;
612-
private final Constructor<Module> moduleConstructor;
612+
private final Constructor<Module> namedModuleConstructor;
613+
private final Constructor<Module> unnamedModuleConstructor;
613614
private final Field moduleDescriptorField;
614615
private final Field moduleLayerField;
615616
private final Field moduleLoaderField;
@@ -670,7 +671,8 @@ private static final class ModuleLayerFeatureUtils {
670671
everyoneSet = new HashSet<>(1);
671672
everyoneSet.add(everyoneModule);
672673

673-
moduleConstructor = ReflectionUtil.lookupConstructor(Module.class, ClassLoader.class, ModuleDescriptor.class);
674+
namedModuleConstructor = ReflectionUtil.lookupConstructor(Module.class, ClassLoader.class, ModuleDescriptor.class);
675+
unnamedModuleConstructor = ReflectionUtil.lookupConstructor(Module.class, ClassLoader.class);
674676
moduleFindModuleMethod = ReflectionUtil.lookupMethod(Module.class, "findModule", String.class, Map.class, Map.class, List.class);
675677

676678
systemModuleFindersAllSystemModulesMethod = ReflectionUtil.lookupMethod(SystemModuleFinders.class, "allSystemModules");
@@ -770,11 +772,7 @@ public ModuleFinder getAppModuleFinder() {
770772
}
771773

772774
public Module getRuntimeModuleForHostedModule(Module hostedModule, boolean optional) {
773-
if (hostedModule.isNamed()) {
774-
return getRuntimeModuleForHostedModule(hostedModule.getClassLoader(), hostedModule.getName(), optional);
775-
} else {
776-
return hostedModule;
777-
}
775+
return getRuntimeModuleForHostedModule(hostedModule.getClassLoader(), hostedModule.getName(), optional);
778776
}
779777

780778
public Module getRuntimeModuleForHostedModule(ClassLoader loader, String hostedModuleName, boolean optional) {
@@ -800,10 +798,15 @@ public Module getRuntimeModuleForHostedModule(ClassLoader loader, String hostedM
800798
}
801799

802800
public Module getOrCreateRuntimeModuleForHostedModule(Module hostedModule) {
803-
if (hostedModule.isNamed()) {
804-
return getOrCreateRuntimeModuleForHostedModule(hostedModule.getClassLoader(), hostedModule.getName(), hostedModule.getDescriptor());
805-
} else {
801+
/*
802+
* Special module instances such as ALL_UNNAMED and EVERYONE_MODULE are not replicated
803+
* as they only serve as marker modules (all their fields are null, including the loader
804+
* field).
805+
*/
806+
if (hostedModule == allUnnamedModule || hostedModule == everyoneModule) {
806807
return hostedModule;
808+
} else {
809+
return getOrCreateRuntimeModuleForHostedModule(hostedModule.getClassLoader(), hostedModule.getName(), hostedModule.getDescriptor());
807810
}
808811
}
809812

@@ -815,7 +818,11 @@ public Module getOrCreateRuntimeModuleForHostedModule(ClassLoader loader, String
815818
}
816819

817820
try {
818-
runtimeModule = moduleConstructor.newInstance(loader, runtimeModuleDescriptor);
821+
if (hostedModuleName == null) {
822+
runtimeModule = unnamedModuleConstructor.newInstance(loader);
823+
} else {
824+
runtimeModule = namedModuleConstructor.newInstance(loader, runtimeModuleDescriptor);
825+
}
819826
} catch (InstantiationException | IllegalAccessException | InvocationTargetException ex) {
820827
throw VMError.shouldNotReachHere("Failed to reflectively construct a runtime Module object.", ex);
821828
}

0 commit comments

Comments
 (0)