Mercurial Hosting > luan
changeset 1859:d4f857a37961
uniqueClassLoader
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 18 Mar 2025 15:38:31 -0600 |
parents | 5257f78d8c83 |
children | bcb015265c21 |
files | src/goodjava/io/FileClassLoader.java src/luan/Luan.java src/luan/modules/PackageLuan.java |
diffstat | 3 files changed, 23 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/goodjava/io/FileClassLoader.java Sat Mar 15 14:35:48 2025 -0600 +++ b/src/goodjava/io/FileClassLoader.java Tue Mar 18 15:38:31 2025 -0600 @@ -51,7 +51,7 @@ private final List<FileInfo> files; - private FileClassLoader(List<FileInfo> files) { + public FileClassLoader(List<FileInfo> files) { super(toURLs(files)); this.files = new ArrayList<FileInfo>(files); }
--- a/src/luan/Luan.java Sat Mar 15 14:35:48 2025 -0600 +++ b/src/luan/Luan.java Tue Mar 18 15:38:31 2025 -0600 @@ -32,19 +32,17 @@ public final Map registry; public final Map rootRegistry; // synchronize access private final Map localOnly = new HashMap(); - private FileClassLoader classLoader; public Luan() { this.registry = new HashMap(); this.rootRegistry = new HashMap(); - this.classLoader = emptyClassLoader; + rootRegistry.put("Luan.classLoader",emptyClassLoader); } public Luan(Luan luan) { LuanMutable.makeImmutable(luan.registry); this.registry = clone(luan.registry); this.rootRegistry = luan.rootRegistry; - this.classLoader = luan.classLoader; } private static Object[] clone(Object[] obj) { @@ -485,16 +483,26 @@ // jars public ClassLoader getClassLoader() { - return classLoader; + synchronized(rootRegistry) { + return (FileClassLoader)rootRegistry.get("Luan.classLoader"); + } } - public void addJar(File jar) throws IOException { + public void addJar(File jar,boolean uniqueClassLoader) throws IOException { FileClassLoader.FileInfo file = new FileClassLoader.FileInfo(jar); - List<FileClassLoader.FileInfo> files = classLoader.getFiles(); - if( files.contains(file) ) - return; - files.add(file); - classLoader = FileClassLoader.getFileClassLoader(files); + synchronized(rootRegistry) { + FileClassLoader classLoader = (FileClassLoader)rootRegistry.get("Luan.classLoader"); + List<FileClassLoader.FileInfo> files = classLoader.getFiles(); + if( files.contains(file) ) + return; + files.add(file); + if( uniqueClassLoader ) { + classLoader = new FileClassLoader(files); + } else { + classLoader = FileClassLoader.getFileClassLoader(files); + } + rootRegistry.put("Luan.classLoader",classLoader); + } } }
--- a/src/luan/modules/PackageLuan.java Sat Mar 15 14:35:48 2025 -0600 +++ b/src/luan/modules/PackageLuan.java Tue Mar 18 15:38:31 2025 -0600 @@ -114,12 +114,14 @@ } } - public static void load_jar(Luan luan,Object jar) throws LuanException, IOException { + public static void load_jar(Luan luan,Object jar,Boolean uniqueClassLoader) throws LuanException, IOException { Luan.checkSecurity(luan,"java"); + if( uniqueClassLoader == null ) + uniqueClassLoader = Boolean.FALSE; File file = IoLuan.objToFile(luan,jar); if( file==null ) throw new LuanException( "bad argument #1 to 'load_jar' (string or file table expected)" ); - luan.addJar(file); + luan.addJar(file,uniqueClassLoader); } }