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";