Mercurial Hosting > luan
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) { |
