Mercurial Hosting > luan
annotate src/luan/Luan.java @ 1766:8df0b80e715e
fix scheduled tasks
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 06 Jun 2023 14:33:24 -0600 |
parents | 164c6ea53147 |
children | ca98dee04e08 |
rev | line source |
---|---|
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1 package luan; |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
1454 | 3 import java.lang.reflect.Array; |
1424 | 4 import java.io.IOException; |
318
4fe6c9fed486
add html processing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
296
diff
changeset
|
5 import java.util.List; |
1113 | 6 import java.util.ArrayList; |
7 import java.util.Map; | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
8 import java.util.HashMap; |
1113 | 9 import java.util.LinkedHashMap; |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
10 import java.util.Iterator; |
1113 | 11 import java.util.Arrays; |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
12 import java.util.Set; |
1578 | 13 import java.util.Collection; |
1590
bce893009f90
add java compiler check
Franklin Schmidt <fschmidt@gmail.com>
parents:
1580
diff
changeset
|
14 import javax.tools.ToolProvider; |
1402
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1401
diff
changeset
|
15 import goodjava.logging.Logger; |
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1401
diff
changeset
|
16 import goodjava.logging.LoggerFactory; |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
17 import luan.modules.JavaLuan; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
18 import luan.modules.PackageLuan; |
1424 | 19 import luan.modules.IoLuan; |
1393 | 20 import luan.modules.logging.LuanLogger; |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
21 import luan.impl.LuanCompiler; |
134
b585d0915621
remove CmdLine.java and move code to Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
113
diff
changeset
|
22 |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
23 |
1578 | 24 public final class Luan { |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
25 private static final Logger logger = LoggerFactory.getLogger(Luan.class); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
26 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
27 private final List<LuanClosure> stack = new ArrayList<LuanClosure>(); |
1578 | 28 private final Map registry; |
29 private final Map localOnly = new HashMap(); | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
30 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
31 public Luan() { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
32 registry = new HashMap(); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
33 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
34 |
1578 | 35 public Luan(Luan luan) { |
36 LuanMutable.makeImmutable(luan.registry); | |
37 this.registry = clone(luan.registry); | |
38 } | |
39 | |
40 private static Object[] clone(Object[] obj) { | |
41 if( obj.length == 0 ) | |
42 return obj; | |
43 Object[] rtn = obj.clone(); | |
44 for( int i=0; i<rtn.length; i++ ) { | |
45 rtn[i] = clone(rtn[i]); | |
46 } | |
47 return rtn; | |
48 } | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
49 |
1578 | 50 private static Map clone(Map obj) { |
51 Map rtn; | |
52 try { | |
53 rtn = obj.getClass().newInstance(); | |
54 } catch(InstantiationException e) { | |
55 throw new RuntimeException(e); | |
56 } catch(IllegalAccessException e) { | |
57 throw new RuntimeException(e); | |
58 } | |
59 for( Object stupid : obj.entrySet() ) { | |
60 Map.Entry entry = (Map.Entry)stupid; | |
61 rtn.put( clone(entry.getKey()), clone(entry.getValue()) ); | |
62 } | |
63 return rtn; | |
64 } | |
65 | |
66 private static Collection clone(Collection obj) { | |
67 Collection rtn; | |
68 try { | |
69 rtn = obj.getClass().newInstance(); | |
70 } catch(InstantiationException e) { | |
71 throw new RuntimeException(e); | |
72 } catch(IllegalAccessException e) { | |
73 throw new RuntimeException(e); | |
74 } | |
75 for( Object entry : (Collection)obj ) { | |
76 rtn.add( clone(entry) ); | |
77 } | |
78 return rtn; | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
79 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
80 |
1578 | 81 private static Object clone(Object obj) { |
82 if( obj instanceof Object[] ) | |
83 return clone((Object[])obj); | |
84 if( obj instanceof Map ) | |
85 return clone((Map)obj); | |
86 if( obj instanceof Collection ) | |
87 return clone((Collection)obj); | |
88 return obj; | |
89 } | |
90 | |
91 private Map clonedLocals(Object obj) { | |
92 Map locals = (Map)registry.get("Luan.local"); | |
93 if( locals==null ) { | |
94 locals = new HashMap(); | |
95 registry.put("Luan.local",locals); | |
96 } | |
97 Map local = (Map)locals.get(obj); | |
98 if( local==null ) { | |
99 local = new HashMap(); | |
100 locals.put(obj,local); | |
101 } | |
102 return local; | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
103 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
104 |
1578 | 105 public Object getLocalCloned(Object obj,Object key) { |
106 return clonedLocals(obj).get(key); | |
107 } | |
108 | |
109 public void setLocalCloned(Object obj,Object key,Object value) { | |
110 if( value==null ) | |
111 clonedLocals(obj).remove(key); | |
112 else | |
113 clonedLocals(obj).put(key,value); | |
114 } | |
115 | |
1763 | 116 public LuanFunction pairsLocalCloned(Object obj) throws LuanException { |
117 return new LuanTable(clonedLocals(obj)).pairs(this); | |
118 } | |
119 | |
1578 | 120 private Map onlyLocals(Object obj) { |
121 Map local = (Map)localOnly.get(obj); | |
122 if( local==null ) { | |
123 local = new HashMap(); | |
124 localOnly.put(obj,local); | |
125 } | |
126 return local; | |
127 } | |
128 | |
129 public Object getLocalOnly(Object obj,Object key) { | |
130 return onlyLocals(obj).get(key); | |
131 } | |
132 | |
133 public void setLocalOnly(Object obj,Object key,Object value) { | |
134 if( value==null ) | |
135 onlyLocals(obj).remove(key); | |
136 else | |
137 onlyLocals(obj).put(key,value); | |
138 } | |
1561 | 139 |
1763 | 140 public LuanFunction pairsLocalOnly(Object obj) throws LuanException { |
141 return new LuanTable(onlyLocals(obj)).pairs(this); | |
142 } | |
143 | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
144 public LuanClosure peek() { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
145 return peek(1); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
146 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
147 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
148 public LuanClosure peek(int i) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
149 int n = stack.size(); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
150 return n < i ? null : stack.get(n-i); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
151 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
152 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
153 void push(LuanClosure closure) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
154 stack.add(closure); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
155 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
156 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
157 void pop() { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
158 stack.remove(stack.size()-1); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
159 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
160 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
161 public Map registry() { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
162 return registry; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
163 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
164 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
165 public Object eval(String cmd,Object... args) throws LuanException { |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
166 return load(cmd,"eval",false).call(this,args); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
167 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
168 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
169 public Object require(String modName) throws LuanException { |
1580 | 170 return require(modName,null); |
171 } | |
172 | |
173 public Object require(String modName,LuanTable options) throws LuanException { | |
174 return PackageLuan.require(this,modName,options); | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
175 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
176 |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
177 public String luanToString(Object obj) throws LuanException { |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
178 if( obj instanceof LuanTable ) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
179 LuanTable tbl = (LuanTable)obj; |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
180 return tbl.toStringLuan(this); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
181 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
182 if( obj == null ) |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
183 return "nil"; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
184 if( obj instanceof Number ) |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
185 return Luan.toString((Number)obj); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
186 if( obj instanceof byte[] ) |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
187 return "binary: " + Integer.toHexString(obj.hashCode()); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
188 return obj.toString(); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
189 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
190 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
191 public Object index(Object obj,Object key) throws LuanException { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
192 if( obj instanceof LuanTable ) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
193 LuanTable tbl = (LuanTable)obj; |
1562 | 194 return tbl.get(this,key); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
195 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
196 if( obj != null && peek().javaOk ) |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
197 return JavaLuan.__index(this,obj,key); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
198 throw new LuanException("attempt to index a " + Luan.type(obj) + " value" ); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
199 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
200 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
201 |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
202 public boolean isLessThan(Object o1,Object o2) throws LuanException { |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
203 if( o1 instanceof Number && o2 instanceof Number ) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
204 Number n1 = (Number)o1; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
205 Number n2 = (Number)o2; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
206 return n1.doubleValue() < n2.doubleValue(); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
207 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
208 if( o1 instanceof String && o2 instanceof String ) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
209 String s1 = (String)o1; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
210 String s2 = (String)o2; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
211 return s1.compareTo(s2) < 0; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
212 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
213 LuanFunction fn = getBinHandler("__lt",o1,o2); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
214 if( fn != null ) |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
215 return Luan.checkBoolean( Luan.first(fn.call(this,o1,o2)) ); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
216 throw new LuanException( "attempt to compare " + Luan.type(o1) + " with " + Luan.type(o2) ); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
217 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
218 |
1578 | 219 public LuanFunction getBinHandler(String op,Object o1,Object o2) throws LuanException { |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
220 if( o1 instanceof LuanTable ) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
221 LuanFunction f1 = getHandlerFunction(op,(LuanTable)o1); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
222 if( f1 != null ) |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
223 return f1; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
224 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
225 return o2 instanceof LuanTable ? getHandlerFunction(op,(LuanTable)o2) : null; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
226 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
227 |
1578 | 228 public LuanFunction getHandlerFunction(String op,LuanTable t) throws LuanException { |
229 Object f = t.getHandler(this,op); | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
230 if( f == null ) |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
231 return null; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
232 return Luan.checkFunction(f); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
233 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
234 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
235 public LuanTable toTable(Object obj) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
236 if( obj == null ) |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
237 return null; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
238 if( obj instanceof LuanTable ) |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
239 return (LuanTable)obj; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
240 if( obj instanceof List ) { |
1562 | 241 return new LuanTable((List)obj); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
242 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
243 if( obj instanceof Map ) { |
1562 | 244 return new LuanTable((Map)obj); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
245 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
246 if( obj instanceof Set ) { |
1562 | 247 return new LuanTable((Set)obj); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
248 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
249 Class cls = obj.getClass(); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
250 if( cls.isArray() ) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
251 if( cls.getComponentType().isPrimitive() ) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
252 int len = Array.getLength(obj); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
253 List list = new ArrayList(); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
254 for( int i=0; i<len; i++ ) { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
255 list.add(Array.get(obj,i)); |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
256 } |
1562 | 257 return new LuanTable(list); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
258 } else { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
259 Object[] a = (Object[])obj; |
1562 | 260 return new LuanTable(Arrays.asList(a)); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
261 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
262 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
263 return null; |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
264 } |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
265 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
266 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
267 |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
268 // static |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
269 |
1685 | 270 public static String[] args = null; |
271 | |
481
5d4a78c93383
luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
446
diff
changeset
|
272 public static void main(String[] args) throws LuanException { |
1590
bce893009f90
add java compiler check
Franklin Schmidt <fschmidt@gmail.com>
parents:
1580
diff
changeset
|
273 if( ToolProvider.getSystemJavaCompiler()==null ) |
bce893009f90
add java compiler check
Franklin Schmidt <fschmidt@gmail.com>
parents:
1580
diff
changeset
|
274 throw new LuanException("java compiler not available"); |
1685 | 275 Luan.args = args; |
1454 | 276 Luan luan = new Luan(); |
1424 | 277 LuanFunction fn = loadClasspath(luan,"luan/cmd_line.luan"); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
278 fn.call(luan,(Object[])args); |
134
b585d0915621
remove CmdLine.java and move code to Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
113
diff
changeset
|
279 } |
1454 | 280 |
281 public static LuanFunction loadClasspath(Luan luan,String classpath) | |
282 throws LuanException | |
283 { | |
1424 | 284 try { |
1454 | 285 String src = IoLuan.classpath(luan,classpath).read_text(); |
286 return luan.load(src,"classpath:"+classpath,true); | |
287 } catch(IOException e) { | |
288 throw new RuntimeException(e); | |
1424 | 289 } |
290 } | |
1454 | 291 |
111
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
292 public static Object first(Object obj) { |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
293 if( !(obj instanceof Object[]) ) |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
294 return obj; |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
295 Object[] a = (Object[])obj; |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
296 return a.length==0 ? null : a[0]; |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
297 } |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
298 |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
299 public static Object[] array(Object obj) { |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
300 return obj instanceof Object[] ? (Object[])obj : new Object[]{obj}; |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
301 } |
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
105
diff
changeset
|
302 |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
303 public static String type(Object obj) { |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
304 if( obj == null ) |
105
a9560839104d
minor - change type names to lower case like Lua
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
104
diff
changeset
|
305 return "nil"; |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
306 if( obj instanceof String ) |
105
a9560839104d
minor - change type names to lower case like Lua
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
104
diff
changeset
|
307 return "string"; |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
308 if( obj instanceof Boolean ) |
105
a9560839104d
minor - change type names to lower case like Lua
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
104
diff
changeset
|
309 return "boolean"; |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
310 if( obj instanceof Number ) |
105
a9560839104d
minor - change type names to lower case like Lua
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
104
diff
changeset
|
311 return "number"; |
85
b2551f00bc51
fix type()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
66
diff
changeset
|
312 if( obj instanceof LuanTable ) |
105
a9560839104d
minor - change type names to lower case like Lua
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
104
diff
changeset
|
313 return "table"; |
85
b2551f00bc51
fix type()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
66
diff
changeset
|
314 if( obj instanceof LuanFunction ) |
105
a9560839104d
minor - change type names to lower case like Lua
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
104
diff
changeset
|
315 return "function"; |
113
8c706d6eb5dc
add binary type
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
111
diff
changeset
|
316 if( obj instanceof byte[] ) |
8c706d6eb5dc
add binary type
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
111
diff
changeset
|
317 return "binary"; |
513
0dfc01d8d42d
rename type "userdata" to "java"
Franklin Schmidt <fschmidt@gmail.com>
parents:
481
diff
changeset
|
318 return "java"; |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
319 } |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
320 |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
321 public static String toString(Number n) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
322 if( n instanceof Integer ) |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
323 return n.toString(); |
255
e5ad26746c94
improve toString(Number)
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
226
diff
changeset
|
324 int i = n.intValue(); |
e5ad26746c94
improve toString(Number)
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
226
diff
changeset
|
325 if( i == n.doubleValue() ) |
e5ad26746c94
improve toString(Number)
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
226
diff
changeset
|
326 return Integer.toString(i); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
327 String s = n.toString(); |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
328 int iE = s.indexOf('E'); |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
329 String ending = null; |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
330 if( iE != -1 ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
331 ending = s.substring(iE); |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
332 s = s.substring(0,iE); |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
333 } |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
334 if( s.endsWith(".0") ) |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
335 s = s.substring(0,s.length()-2); |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
336 if( ending != null ) |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
337 s += ending; |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
338 return s; |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
339 } |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
340 |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
341 public static Integer asInteger(Object obj) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
342 if( obj instanceof Integer ) |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
343 return (Integer)obj; |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
344 if( !(obj instanceof Number) ) |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
345 return null; |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
346 Number n = (Number)obj; |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
347 int i = n.intValue(); |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
348 return i==n.doubleValue() ? Integer.valueOf(i) : null; |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
349 } |
66
f7e17cfb35f9
minor toString() improvement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
48
diff
changeset
|
350 |
1442 | 351 public static Long asLong(Object obj) { |
352 if( obj instanceof Long ) | |
353 return (Long)obj; | |
354 if( !(obj instanceof Number) ) | |
355 return null; | |
356 Number n = (Number)obj; | |
357 long i = n.longValue(); | |
358 return i==n.doubleValue() ? Long.valueOf(i) : null; | |
359 } | |
360 | |
361 public static Float asFloat(Object obj) { | |
362 if( obj instanceof Float ) | |
363 return (Float)obj; | |
364 if( !(obj instanceof Number) ) | |
365 return null; | |
366 Number n = (Number)obj; | |
367 float i = n.floatValue(); | |
368 return i==n.doubleValue() ? Float.valueOf(i) : null; | |
369 } | |
370 | |
371 public static Double asDouble(Object obj) { | |
372 if( obj instanceof Double ) | |
373 return (Double)obj; | |
374 if( !(obj instanceof Number) ) | |
375 return null; | |
376 Number n = (Number)obj; | |
377 double i = n.doubleValue(); | |
378 return Double.valueOf(i); | |
379 } | |
380 | |
88
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
381 public static String stringEncode(String s) { |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
382 s = s.replace("\\","\\\\"); |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
383 s = s.replace("\u0007","\\a"); |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
384 s = s.replace("\b","\\b"); |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
385 s = s.replace("\f","\\f"); |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
386 s = s.replace("\n","\\n"); |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
387 s = s.replace("\r","\\r"); |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
388 s = s.replace("\t","\\t"); |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
389 s = s.replace("\u000b","\\v"); |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
390 s = s.replace("\"","\\\""); |
420 | 391 s = s.replace("\'","\\'"); |
88
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
392 return s; |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
393 } |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
85
diff
changeset
|
394 |
647
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
395 |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
396 public static Boolean checkBoolean(Object obj) throws LuanException { |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
397 if( obj instanceof Boolean ) |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
398 return (Boolean)obj; |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
399 throw new LuanException("attempt to use a " + Luan.type(obj) + " value as a boolean" ); |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
400 } |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
401 |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
402 public static String checkString(Object obj) throws LuanException { |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
403 if( obj instanceof String ) |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
404 return (String)obj; |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
405 throw new LuanException("attempt to use a " + Luan.type(obj) + " value as a string" ); |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
406 } |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
407 |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
408 public static LuanFunction checkFunction(Object obj) throws LuanException { |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
409 if( obj instanceof LuanFunction ) |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
410 return (LuanFunction)obj; |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
411 throw new LuanException("attempt to call a " + Luan.type(obj) + " value" ); |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
412 } |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
413 |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1432
diff
changeset
|
414 public LuanFunction load(String text,String sourceName,boolean persist,LuanTable env) |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
415 throws LuanException |
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
416 { |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1432
diff
changeset
|
417 return LuanCompiler.compile(this,text,sourceName,persist,env); |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
418 } |
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
419 |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1432
diff
changeset
|
420 public LuanFunction load(String text,String sourceName,boolean persist) |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
421 throws LuanException |
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
422 { |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1432
diff
changeset
|
423 return load(text,sourceName,persist,null); |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
424 } |
647
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
425 |
1113 | 426 public static Object toJava(Object obj) throws LuanException { |
427 if( !(obj instanceof LuanTable) ) | |
428 return obj; | |
429 LuanTable tbl = (LuanTable)obj; | |
1464 | 430 if( !tbl.isMap() ) { |
1113 | 431 List list = new ArrayList(); |
432 for( Object el : tbl.asList() ) { | |
433 list.add( toJava(el) ); | |
434 } | |
435 return list; | |
436 } else { | |
437 Map map = new LinkedHashMap(); | |
438 Iterator<Map.Entry> iter = tbl.rawIterator(); | |
439 while( iter.hasNext() ) { | |
440 Map.Entry entry = iter.next(); | |
441 map.put( toJava(entry.getKey()), toJava(entry.getValue()) ); | |
442 } | |
443 return map; | |
444 } | |
445 } | |
1330 | 446 |
447 | |
448 // security | |
449 | |
450 public interface Security { | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
451 public void check(Luan luan,LuanClosure closure,String op,Object... args) throws LuanException; |
1330 | 452 } |
453 | |
1766 | 454 private static final String SECURITY_KEY = "Luan.Security"; |
1330 | 455 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
456 public static void checkSecurity(Luan luan,String op,Object... args) throws LuanException { |
1330 | 457 check(luan,1,op,args); |
458 } | |
459 | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
460 public static void checkCallerSecurity(Luan luan,String op,Object... args) throws LuanException { |
1330 | 461 check(luan,2,op,args); |
462 } | |
463 | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
464 private static void check(Luan luan,int i,String op,Object... args) throws LuanException { |
1330 | 465 Security s = (Security)luan.registry().get(SECURITY_KEY); |
466 if( s!=null ) | |
1432 | 467 s.check(luan,luan.peek(i),op,args); |
1330 | 468 } |
469 | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
470 public static Security setSecurity(Luan luan,Security s) { |
1330 | 471 return (Security)luan.registry().put(SECURITY_KEY,s); |
472 } | |
473 | |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
474 } |