--- old/src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java 2020-08-12 15:04:55.389508311 -0700 +++ new/src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java 2020-08-12 15:04:55.185500632 -0700 @@ -36,7 +36,7 @@ import jdk.internal.access.JavaLangAccess; import jdk.internal.access.SharedSecrets; import jdk.internal.misc.VM; -import jdk.internal.vm.annotation.Stable; +import jdk.internal.module.ServicesCatalog; /** * Creates and provides access to the built-in platform and application class @@ -55,43 +55,22 @@ private static final PlatformClassLoader PLATFORM_LOADER; private static final AppClassLoader APP_LOADER; - static class ArchivedData { - private final BootClassLoader boot_loader; - private final PlatformClassLoader platform_loader; - private final AppClassLoader app_loader; - - private ArchivedData() { - boot_loader = BOOT_LOADER; - platform_loader = PLATFORM_LOADER; - app_loader = APP_LOADER; - } - - static void archive() { - singleton = new ArchivedData(); - } - - static ArchivedData get() { - return singleton; - } - - private static ArchivedData singleton; - } - // Creates the built-in class loaders. static { - VM.initializeFromArchive(ArchivedData.class); - ArchivedData archivedData = ArchivedData.get(); - if (archivedData != null) { + ArchivedClassLoaders archivedClassLoaders = ArchivedClassLoaders.get(); + if (archivedClassLoaders != null) { // assert VM.getSavedProperty("jdk.boot.class.path.append") == null - BOOT_LOADER = archivedData.boot_loader; - PLATFORM_LOADER = archivedData.platform_loader; + BOOT_LOADER = (BootClassLoader) archivedClassLoaders.bootLoader(); + PLATFORM_LOADER = (PlatformClassLoader) archivedClassLoaders.platformLoader(); + ServicesCatalog catalog = archivedClassLoaders.servicesCatalog(PLATFORM_LOADER); + ServicesCatalog.putServicesCatalog(PLATFORM_LOADER, catalog); } else { // -Xbootclasspath/a or -javaagent with Boot-Class-Path attribute String append = VM.getSavedProperty("jdk.boot.class.path.append"); - BOOT_LOADER = - new BootClassLoader((append != null && !append.isEmpty()) + URLClassPath ucp = (append != null && !append.isEmpty()) ? new URLClassPath(append, true) - : null); + : null; + BOOT_LOADER = new BootClassLoader(ucp); PLATFORM_LOADER = new PlatformClassLoader(BOOT_LOADER); } // A class path is required when no initial module is specified. @@ -105,12 +84,14 @@ cp = (initialModuleName == null) ? "" : null; } URLClassPath ucp = new URLClassPath(cp, false); - if (archivedData != null) { - APP_LOADER = archivedData.app_loader; + if (archivedClassLoaders != null) { + APP_LOADER = (AppClassLoader) archivedClassLoaders.appLoader(); + ServicesCatalog catalog = archivedClassLoaders.servicesCatalog(APP_LOADER); + ServicesCatalog.putServicesCatalog(APP_LOADER, catalog); APP_LOADER.setClassPath(ucp); } else { APP_LOADER = new AppClassLoader(PLATFORM_LOADER, ucp); - ArchivedData.archive(); + ArchivedClassLoaders.archive(); } } @@ -180,15 +161,8 @@ throw new InternalError(); } - @Stable URLClassPath ucp; - void setClassPath(URLClassPath ucp) { - super.setClassPath(ucp); - this.ucp = ucp; - } - - AppClassLoader(PlatformClassLoader parent, URLClassPath ucp) { + AppClassLoader(BuiltinClassLoader parent, URLClassPath ucp) { super("app", parent, ucp); - this.ucp = ucp; } @Override @@ -221,7 +195,7 @@ * @see java.lang.instrument.Instrumentation#appendToSystemClassLoaderSearch */ void appendToClassPathForInstrumentation(String path) { - ucp.addFile(path); + appendClassPath(path); } /** @@ -231,9 +205,11 @@ return super.defineOrCheckPackage(pn, man, url); } - // Called from VM only, during -Xshare:dump + /** + * Called by the VM, during -Xshare:dump + */ private void resetArchivedStates() { - ucp = null; + setClassPath(null); } }