Mercurial Hosting > luan
comparison src/luan/LuanJavaFunction.java @ 1267:9fa8b8389578
add LuanTable.luan;
support metatable __gc();
add luan.sql;
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 12 Nov 2018 02:10:41 -0700 |
parents | e8020216dee7 |
children | 25746915a241 |
comparison
equal
deleted
inserted
replaced
1266:05934fbf635a | 1267:9fa8b8389578 |
---|---|
56 } | 56 } |
57 | 57 |
58 @Override public Object call(LuanState luan,Object[] args) throws LuanException { | 58 @Override public Object call(LuanState luan,Object[] args) throws LuanException { |
59 try { | 59 try { |
60 args = fixArgs(luan,args); | 60 args = fixArgs(luan,args); |
61 return doCall(args); | 61 return doCall(luan,args); |
62 } catch(IllegalArgumentException e) { | 62 } catch(IllegalArgumentException e) { |
63 checkArgs(args); | 63 checkArgs(args); |
64 throw e; | 64 throw e; |
65 } | 65 } |
66 } | 66 } |
67 | 67 |
68 public Object rawCall(LuanState luan,Object[] args) throws LuanException { | 68 public Object rawCall(LuanState luan,Object[] args) throws LuanException { |
69 args = fixArgs(luan,args); | 69 args = fixArgs(luan,args); |
70 return doCall(args); | 70 return doCall(luan,args); |
71 } | 71 } |
72 | 72 |
73 private Object doCall(Object[] args) throws LuanException { | 73 private Object doCall(LuanState luan,Object[] args) throws LuanException { |
74 Object rtn; | 74 Object rtn; |
75 try { | 75 try { |
76 rtn = method.invoke(obj,args); | 76 rtn = method.invoke(obj,args); |
77 } catch(IllegalAccessException e) { | 77 } catch(IllegalAccessException e) { |
78 throw new RuntimeException("method = "+method,e); | 78 throw new RuntimeException("method = "+method,e); |
84 throw (LuanException)cause; | 84 throw (LuanException)cause; |
85 throw new LuanException(cause); | 85 throw new LuanException(cause); |
86 } catch(InstantiationException e) { | 86 } catch(InstantiationException e) { |
87 throw new RuntimeException(e); | 87 throw new RuntimeException(e); |
88 } | 88 } |
89 return rtnConverter.convert(rtn); | 89 return rtnConverter.convert(luan,rtn); |
90 } | 90 } |
91 | 91 |
92 private static final Map primitiveMap = new HashMap(); | 92 private static final Map primitiveMap = new HashMap(); |
93 static { | 93 static { |
94 primitiveMap.put(Boolean.TYPE,Boolean.class); | 94 primitiveMap.put(Boolean.TYPE,Boolean.class); |
187 return rtn; | 187 return rtn; |
188 } | 188 } |
189 | 189 |
190 | 190 |
191 private interface RtnConverter { | 191 private interface RtnConverter { |
192 public Object convert(Object obj); | 192 public Object convert(LuanState luan,Object obj); |
193 } | 193 } |
194 | 194 |
195 private static final RtnConverter RTN_NOTHING = new RtnConverter() { | 195 private static final RtnConverter RTN_NOTHING = new RtnConverter() { |
196 @Override public Object[] convert(Object obj) { | 196 @Override public Object[] convert(LuanState luan,Object obj) { |
197 return NOTHING; | 197 return NOTHING; |
198 } | 198 } |
199 }; | 199 }; |
200 | 200 |
201 private static final RtnConverter RTN_SAME = new RtnConverter() { | 201 private static final RtnConverter RTN_SAME = new RtnConverter() { |
202 @Override public Object convert(Object obj) { | 202 @Override public Object convert(LuanState luan,Object obj) { |
203 return obj; | 203 return obj; |
204 } | 204 } |
205 }; | 205 }; |
206 | 206 |
207 private static final RtnConverter RTN_ARRAY = new RtnConverter() { | 207 private static final RtnConverter RTN_ARRAY = new RtnConverter() { |
208 @Override public Object convert(Object obj) { | 208 @Override public Object convert(LuanState luan,Object obj) { |
209 if( obj == null ) | 209 if( obj == null ) |
210 return null; | 210 return null; |
211 Object[] a = new Object[Array.getLength(obj)]; | 211 Object[] a = new Object[Array.getLength(obj)]; |
212 for( int i=0; i<a.length; i++ ) { | 212 for( int i=0; i<a.length; i++ ) { |
213 a[i] = Array.get(obj,i); | 213 a[i] = Array.get(obj,i); |
214 } | 214 } |
215 return new LuanTable(new ArrayList<Object>(Arrays.asList(a))); | 215 return new LuanTable(luan,new ArrayList<Object>(Arrays.asList(a))); |
216 } | 216 } |
217 }; | 217 }; |
218 | 218 |
219 private static RtnConverter getRtnConverter(JavaMethod m) { | 219 private static RtnConverter getRtnConverter(JavaMethod m) { |
220 Class rtnType = m.getReturnType(); | 220 Class rtnType = m.getReturnType(); |
337 } | 337 } |
338 }; | 338 }; |
339 | 339 |
340 private static final ArgConverter ARG_TABLE = new ArgConverter() { | 340 private static final ArgConverter ARG_TABLE = new ArgConverter() { |
341 public Object convert(LuanState luan,Object obj) { | 341 public Object convert(LuanState luan,Object obj) { |
342 LuanTable tbl = Luan.toTable(obj); | 342 LuanTable tbl = luan.toTable(obj); |
343 return tbl!=null ? tbl : obj; | 343 return tbl!=null ? tbl : obj; |
344 } | 344 } |
345 @Override public String toString() { | 345 @Override public String toString() { |
346 return "ARG_TABLE"; | 346 return "ARG_TABLE"; |
347 } | 347 } |
349 | 349 |
350 private static final ArgConverter ARG_MAP = new ArgConverter() { | 350 private static final ArgConverter ARG_MAP = new ArgConverter() { |
351 public Object convert(LuanState luan,Object obj) throws LuanException { | 351 public Object convert(LuanState luan,Object obj) throws LuanException { |
352 if( obj instanceof LuanTable ) { | 352 if( obj instanceof LuanTable ) { |
353 LuanTable t = (LuanTable)obj; | 353 LuanTable t = (LuanTable)obj; |
354 return t.asMap(luan); | 354 return t.asMap(); |
355 } | 355 } |
356 return obj; | 356 return obj; |
357 } | 357 } |
358 @Override public String toString() { | 358 @Override public String toString() { |
359 return "ARG_MAP"; | 359 return "ARG_MAP"; |
376 | 376 |
377 private static final ArgConverter ARG_SET = new ArgConverter() { | 377 private static final ArgConverter ARG_SET = new ArgConverter() { |
378 public Object convert(LuanState luan,Object obj) throws LuanException { | 378 public Object convert(LuanState luan,Object obj) throws LuanException { |
379 if( obj instanceof LuanTable ) { | 379 if( obj instanceof LuanTable ) { |
380 LuanTable t = (LuanTable)obj; | 380 LuanTable t = (LuanTable)obj; |
381 if( t.isSet(luan) ) | 381 if( t.isSet() ) |
382 return t.asSet(luan); | 382 return t.asSet(); |
383 } | 383 } |
384 return obj; | 384 return obj; |
385 } | 385 } |
386 @Override public String toString() { | 386 @Override public String toString() { |
387 return "ARG_SET"; | 387 return "ARG_SET"; |
392 public Object convert(LuanState luan,Object obj) throws LuanException { | 392 public Object convert(LuanState luan,Object obj) throws LuanException { |
393 if( obj instanceof LuanTable ) { | 393 if( obj instanceof LuanTable ) { |
394 LuanTable t = (LuanTable)obj; | 394 LuanTable t = (LuanTable)obj; |
395 if( t.isList() ) | 395 if( t.isList() ) |
396 return t.asList(); | 396 return t.asList(); |
397 if( t.isSet(luan) ) | 397 if( t.isSet() ) |
398 return t.asSet(luan); | 398 return t.asSet(); |
399 } | 399 } |
400 return obj; | 400 return obj; |
401 } | 401 } |
402 @Override public String toString() { | 402 @Override public String toString() { |
403 return "ARG_COLLECTION"; | 403 return "ARG_COLLECTION"; |