# HG changeset patch # User redestad # Date 1581000170 -3600 # Thu Feb 06 15:42:50 2020 +0100 # Node ID 9d638b488ce307502845d48aa390ab72a5441368 # Parent 1c4286ec9e45a692c2e04675e0c6d0b346c1fb89 8238599: Refactor and simplify implAddOpensToAllUnnamed Reviewed-by: alanb diff --git a/src/java.base/share/classes/java/lang/Module.java b/src/java.base/share/classes/java/lang/Module.java --- a/src/java.base/share/classes/java/lang/Module.java +++ b/src/java.base/share/classes/java/lang/Module.java @@ -909,12 +909,12 @@ } /** - * Updates a module to open all packages returned by the given iterator to - * all unnamed modules. + * Updates a module to open all packages in the given sets to all unnamed + * modules. * * @apiNote Used during startup to open packages for illegal access. */ - void implAddOpensToAllUnnamed(Iterator iterator) { + void implAddOpensToAllUnnamed(Set concealedPkgs, Set exportedPkgs) { if (jdk.internal.misc.VM.isModuleSystemInited()) { throw new IllegalStateException("Module system already initialized"); } @@ -923,12 +923,17 @@ // the packages to all unnamed modules. Map> openPackages = this.openPackages; if (openPackages == null) { - openPackages = new HashMap<>(); + openPackages = new HashMap<>((4 * (concealedPkgs.size() + exportedPkgs.size()) / 3) + 1); } else { openPackages = new HashMap<>(openPackages); } - while (iterator.hasNext()) { - String pn = iterator.next(); + implAddOpensToAllUnnamed(concealedPkgs, openPackages); + implAddOpensToAllUnnamed(exportedPkgs, openPackages); + this.openPackages = openPackages; + } + + private void implAddOpensToAllUnnamed(Set pkgs, Map> openPackages) { + for (String pn : pkgs) { Set prev = openPackages.putIfAbsent(pn, ALL_UNNAMED_MODULE_SET); if (prev != null) { prev.add(ALL_UNNAMED_MODULE); @@ -937,10 +942,8 @@ // update VM to export the package addExportsToAllUnnamed0(this, pn); } - this.openPackages = openPackages; } - // -- services -- /** diff --git a/src/java.base/share/classes/java/lang/System.java b/src/java.base/share/classes/java/lang/System.java --- a/src/java.base/share/classes/java/lang/System.java +++ b/src/java.base/share/classes/java/lang/System.java @@ -56,6 +56,7 @@ import java.util.Properties; import java.util.PropertyPermission; import java.util.ResourceBundle; +import java.util.Set; import java.util.function.Supplier; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; @@ -2234,8 +2235,8 @@ public void addOpensToAllUnnamed(Module m, String pn) { m.implAddOpensToAllUnnamed(pn); } - public void addOpensToAllUnnamed(Module m, Iterator packages) { - m.implAddOpensToAllUnnamed(packages); + public void addOpensToAllUnnamed(Module m, Set concealedPackages, Set exportedPackages) { + m.implAddOpensToAllUnnamed(concealedPackages, exportedPackages); } public void addUses(Module m, Class service) { m.implAddUses(service); diff --git a/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java b/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java --- a/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java +++ b/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java @@ -37,6 +37,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; @@ -221,9 +222,9 @@ void addOpensToAllUnnamed(Module m, String pkg); /** - * Updates module m to open all packages returned by the given iterator. + * Updates module m to open all packages in the given sets. */ - void addOpensToAllUnnamed(Module m, Iterator packages); + void addOpensToAllUnnamed(Module m, Set concealedPkgs, Set exportedPkgs); /** * Updates module m to use a service. diff --git a/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java b/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java --- a/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java +++ b/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java @@ -800,6 +800,8 @@ exportedPackagesToOpen = maps.exportedPackagesToOpen(); } + Set emptySet = Set.of(); + // open specific packages in the system modules for (Module m : bootLayer.modules()) { ModuleDescriptor descriptor = m.getDescriptor(); @@ -816,8 +818,8 @@ continue; } - Set concealedPackages = concealedPackagesToOpen.getOrDefault(name, Set.of()); - Set exportedPackages = exportedPackagesToOpen.getOrDefault(name, Set.of()); + Set concealedPackages = concealedPackagesToOpen.getOrDefault(name, emptySet); + Set exportedPackages = exportedPackagesToOpen.getOrDefault(name, emptySet); // refresh the set of concealed and exported packages if needed if (extraExportsOrOpens) { @@ -850,8 +852,7 @@ // open the packages to unnamed modules JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); - jla.addOpensToAllUnnamed(m, concat(concealedPackages.iterator(), - exportedPackages.iterator())); + jla.addOpensToAllUnnamed(m, concealedPackages, exportedPackages); } builder.complete(); @@ -996,25 +997,6 @@ } /** - * Returns an iterator that yields all elements of the first iterator - * followed by all the elements of the second iterator. - */ - static Iterator concat(Iterator iterator1, Iterator iterator2) { - return new Iterator() { - @Override - public boolean hasNext() { - return iterator1.hasNext() || iterator2.hasNext(); - } - @Override - public T next() { - if (iterator1.hasNext()) return iterator1.next(); - if (iterator2.hasNext()) return iterator2.next(); - throw new NoSuchElementException(); - } - }; - } - - /** * Wraps a (potentially not thread safe) ModuleFinder created during startup * for use after startup. */