Mercurial Hosting > luan
annotate src/luan/modules/PackageLuan.java @ 798:9eccfede1094
fix cloning bug
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 06 Sep 2016 12:23:03 -0600 |
parents | c49980cdece6 |
children | 9c13a15a4002 |
rev | line source |
---|---|
167
4c0131c2b650
merge luan/lib into modules
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
163
diff
changeset
|
1 package luan.modules; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
75
aa7538ae5fb6
can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
74
diff
changeset
|
3 import java.io.IOException; |
aa7538ae5fb6
can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
74
diff
changeset
|
4 import java.util.Arrays; |
86
6db8f286fa6c
_ENV is per module, not global
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
84
diff
changeset
|
5 import java.util.Collections; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
6 import luan.Luan; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
7 import luan.LuanState; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
8 import luan.LuanTable; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
9 import luan.LuanFunction; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
10 import luan.LuanJavaFunction; |
798 | 11 import luan.LuanCloner; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
12 import luan.LuanException; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
13 |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 |
168
ebe9db183eb7
rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
167
diff
changeset
|
15 public final class PackageLuan { |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
16 |
186
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
17 public static final LuanFunction requireFn; |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
18 static { |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
19 try { |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
20 requireFn = new LuanJavaFunction(PackageLuan.class.getMethod("require",LuanState.class,String.class),null); |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
21 } catch(NoSuchMethodException e) { |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
22 throw new RuntimeException(e); |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
23 } |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
24 } |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
25 |
202
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
26 public static LuanTable loaded(LuanState luan) { |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
427
diff
changeset
|
27 LuanTable tbl = (LuanTable)luan.registry().get("Package.loaded"); |
299
a74559240b4f
simplify PackageLuan and remove IO loading param
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
28 if( tbl == null ) { |
411
23b99a5039b5
remove Luan.newTable()
Franklin Schmidt <fschmidt@gmail.com>
parents:
339
diff
changeset
|
29 tbl = new LuanTable(); |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
427
diff
changeset
|
30 luan.registry().put("Package.loaded",tbl); |
299
a74559240b4f
simplify PackageLuan and remove IO loading param
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
31 } |
a74559240b4f
simplify PackageLuan and remove IO loading param
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
32 return tbl; |
202
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
33 } |
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
34 |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
96
diff
changeset
|
35 public static Object require(LuanState luan,String modName) throws LuanException { |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
36 Object mod = load(luan,modName); |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
37 if( mod==null ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
38 throw new LuanException( "module '"+modName+"' not found" ); |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
39 return mod; |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
40 } |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
41 |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
42 public static Object load(LuanState luan,String modName) throws LuanException { |
202
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
43 LuanTable loaded = loaded(luan); |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
411
diff
changeset
|
44 Object mod = loaded.rawGet(modName); |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
45 if( mod == null ) { |
301
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
46 if( modName.startsWith("java:") ) { |
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
47 mod = JavaLuan.load(luan,modName.substring(5)); |
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
48 } else { |
693
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
49 String src = read(luan,modName); |
301
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
50 if( src == null ) |
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
51 return null; |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
52 LuanFunction loader = Luan.load(src,modName); |
503 | 53 mod = Luan.first( |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
54 loader.call(luan,new Object[]{modName}) |
339
673eebd83b74
remove circular package loading
Franklin Schmidt <fschmidt@gmail.com>
parents:
327
diff
changeset
|
55 ); |
503 | 56 if( mod == null ) { |
57 mod = loaded.rawGet(modName); | |
58 if( mod != null ) | |
59 return mod; | |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
60 throw new LuanException( "module '"+modName+"' returned nil" ); |
503 | 61 } |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
62 } |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
63 loaded.rawPut(modName,mod); |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
64 } |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
96
diff
changeset
|
65 return mod; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
66 } |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
67 |
693
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
68 static String read(LuanState luan,String uri) throws LuanException { |
722 | 69 LuanTable t = IoLuan.uri(luan,uri,null); |
264
9e0d4452e649
implement URL style module names
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
260
diff
changeset
|
70 if( t == null ) |
9e0d4452e649
implement URL style module names
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
260
diff
changeset
|
71 return null; |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
72 /* |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
73 LuanFunction existsFn = (LuanFunction)t.get(luan,"exists"); |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
74 boolean exists = (Boolean)Luan.first(existsFn.call(luan)); |
301
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
75 if( !exists ) |
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
76 return null; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
77 LuanFunction reader = (LuanFunction)t.get(luan,"read_text"); |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
78 return (String)Luan.first(reader.call(luan)); |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
79 */ |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
80 IoLuan.LuanIn in = (IoLuan.LuanIn)t.rawGet("java"); |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
81 try { |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
82 if( !in.exists() ) |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
83 return null; |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
84 return in.read_text(); |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
85 } catch(IOException e) { |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
86 throw new LuanException(e); |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
87 } |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
88 } |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
89 |
798 | 90 private static boolean wouldLoad(LuanState luan,String modName) throws LuanException { |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
91 LuanTable loaded = loaded(luan); |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
92 if( loaded.rawGet(modName) != null ) |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
93 return false; |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
94 if( modName.startsWith("java:") ) |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
95 return true; |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
96 LuanTable t = IoLuan.uri(luan,modName,null); |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
97 if( t == null ) |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
98 return false; |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
99 IoLuan.LuanIn in = (IoLuan.LuanIn)t.rawGet("java"); |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
100 try { |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
101 return in.exists(); |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
102 } catch(IOException e) { |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
103 throw new LuanException(e); |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
104 } |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
105 } |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
106 |
798 | 107 public static void enableLoad(LuanState luan,String... mods) throws LuanException { |
108 if( luan.isLocked ) { | |
109 for( String mod : mods ) { | |
110 if( wouldLoad(luan,mod) ) { | |
111 luan.isLocked = false; | |
112 luan.deepenClone(luan,new LuanCloner(LuanCloner.Type.COMPLETE)); | |
113 return; | |
114 } | |
115 } | |
116 } | |
117 } | |
118 | |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
119 } |