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);
 	}
 
 }