comparison src/luan/modules/PackageLuan.java @ 1578:c922446f53aa

immutable threading
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 08 Feb 2021 14:16:19 -0700
parents 8fbcc4747091
children 2975c932864d
comparison
equal deleted inserted replaced
1577:60e5c324adf9 1578:c922446f53aa
3 import java.io.Reader; 3 import java.io.Reader;
4 import java.io.InputStreamReader; 4 import java.io.InputStreamReader;
5 import java.io.IOException; 5 import java.io.IOException;
6 import java.util.Arrays; 6 import java.util.Arrays;
7 import java.util.Collections; 7 import java.util.Collections;
8 import java.util.Map;
9 import java.util.HashMap;
8 import goodjava.io.IoUtils; 10 import goodjava.io.IoUtils;
9 import luan.Luan; 11 import luan.Luan;
10 import luan.LuanTable; 12 import luan.LuanTable;
11 import luan.LuanFunction; 13 import luan.LuanFunction;
12 import luan.LuanJavaFunction; 14 import luan.LuanJavaFunction;
13 import luan.LuanCloner;
14 import luan.LuanException; 15 import luan.LuanException;
15 16
16 17
17 public final class PackageLuan { 18 public final class PackageLuan {
18 19
27 luan.registry().put("Package.require",fn); 28 luan.registry().put("Package.require",fn);
28 } 29 }
29 return fn; 30 return fn;
30 } 31 }
31 32
32 public static LuanTable loaded(Luan luan) { 33 public static Map loaded(Luan luan) {
33 LuanTable tbl = (LuanTable)luan.registry().get("Package.loaded"); 34 Map map = (Map)luan.registry().get("Package.loaded");
34 if( tbl == null ) { 35 if( map == null ) {
35 tbl = new LuanTable(); 36 map = new HashMap();
36 luan.registry().put("Package.loaded",tbl); 37 luan.registry().put("Package.loaded",map);
37 } 38 }
38 return tbl; 39 return map;
39 } 40 }
40 41
41 public static Object require(Luan luan,String modName) throws LuanException { 42 public static Object require(Luan luan,String modName) throws LuanException {
42 if( "java".equals(modName) ) { 43 if( "java".equals(modName) ) {
43 JavaLuan.java(luan); 44 JavaLuan.java(luan);
48 throw new LuanException( "module '"+modName+"' not found" ); 49 throw new LuanException( "module '"+modName+"' not found" );
49 return mod; 50 return mod;
50 } 51 }
51 52
52 public static Object load(Luan luan,String modName) throws LuanException { 53 public static Object load(Luan luan,String modName) throws LuanException {
53 LuanTable loaded = loaded(luan); 54 Map loaded = loaded(luan);
54 Object mod = loaded.rawGet(modName); 55 Object mod = loaded.get(modName);
55 if( mod == null ) { 56 if( mod == null ) {
56 if( modName.equals("luan:Boot.luan") ) { 57 if( modName.equals("luan:Boot.luan") ) {
57 String src; 58 String src;
58 try { 59 try {
59 Reader in = new InputStreamReader(ClassLoader.getSystemResourceAsStream("luan/modules/Boot.luan")); 60 Reader in = new InputStreamReader(ClassLoader.getSystemResourceAsStream("luan/modules/Boot.luan"));
80 LuanFunction loader = luan.load(src,modName,true); 81 LuanFunction loader = luan.load(src,modName,true);
81 mod = Luan.first( 82 mod = Luan.first(
82 loader.call(luan,modName) 83 loader.call(luan,modName)
83 ); 84 );
84 if( mod == null ) { 85 if( mod == null ) {
85 mod = loaded.rawGet(modName); 86 mod = loaded.get(modName);
86 if( mod != null ) 87 if( mod != null )
87 return mod; 88 return mod;
88 throw new LuanException( "module '"+modName+"' returned nil" ); 89 throw new LuanException( "module '"+modName+"' returned nil" );
89 } 90 }
90 } 91 }
91 } 92 }
92 loaded.rawPut(modName,mod); 93 loaded.put(modName,mod);
93 } 94 }
94 return mod; 95 return mod;
95 } 96 }
96 97
97 static String read(Luan luan,String uri) { 98 static String read(Luan luan,String uri) {