Mercurial Hosting > luan
comparison core/src/luan/LuanJavaFunction.java @ 432:d9df6d6cb927
finish fixing LuanTable to use metatables
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sat, 02 May 2015 23:41:59 -0600 |
parents | 3ffe8ba5b297 |
children | 472fc70853cd |
comparison
equal
deleted
inserted
replaced
431:3ffe8ba5b297 | 432:d9df6d6cb927 |
---|---|
138 } | 138 } |
139 } | 139 } |
140 } | 140 } |
141 } | 141 } |
142 | 142 |
143 private Object[] fixArgs(LuanState luan,Object[] args) { | 143 private Object[] fixArgs(LuanState luan,Object[] args) throws LuanException { |
144 int n = argConverters.length; | 144 int n = argConverters.length; |
145 Object[] rtn; | 145 Object[] rtn; |
146 int start = 0; | 146 int start = 0; |
147 if( !takesLuaState && varArgCls==null && args.length == n ) { | 147 if( !takesLuaState && varArgCls==null && args.length == n ) { |
148 rtn = args; | 148 rtn = args; |
161 } else { | 161 } else { |
162 int len = args.length - n; | 162 int len = args.length - n; |
163 Object varArgs = Array.newInstance(varArgCls,len); | 163 Object varArgs = Array.newInstance(varArgCls,len); |
164 ArgConverter ac = argConverters[n]; | 164 ArgConverter ac = argConverters[n]; |
165 for( int i=0; i<len; i++ ) { | 165 for( int i=0; i<len; i++ ) { |
166 Array.set( varArgs, i, ac.convert(args[n+i]) ); | 166 Array.set( varArgs, i, ac.convert(luan,args[n+i]) ); |
167 } | 167 } |
168 rtn[rtn.length-1] = varArgs; | 168 rtn[rtn.length-1] = varArgs; |
169 } | 169 } |
170 } | 170 } |
171 System.arraycopy(args,0,rtn,start,Math.min(args.length,n)); | 171 System.arraycopy(args,0,rtn,start,Math.min(args.length,n)); |
172 } | 172 } |
173 for( int i=0; i<n; i++ ) { | 173 for( int i=0; i<n; i++ ) { |
174 rtn[start+i] = argConverters[i].convert(rtn[start+i]); | 174 rtn[start+i] = argConverters[i].convert(luan,rtn[start+i]); |
175 } | 175 } |
176 return rtn; | 176 return rtn; |
177 } | 177 } |
178 | 178 |
179 | 179 |
224 || rtnType == Double.TYPE | 224 || rtnType == Double.TYPE |
225 ; | 225 ; |
226 } | 226 } |
227 | 227 |
228 private interface ArgConverter { | 228 private interface ArgConverter { |
229 public Object convert(Object obj); | 229 public Object convert(LuanState luan,Object obj) throws LuanException; |
230 } | 230 } |
231 | 231 |
232 private static final ArgConverter ARG_SAME = new ArgConverter() { | 232 private static final ArgConverter ARG_SAME = new ArgConverter() { |
233 public Object convert(Object obj) { | 233 public Object convert(LuanState luan,Object obj) { |
234 return obj; | 234 return obj; |
235 } | 235 } |
236 @Override public String toString() { | 236 @Override public String toString() { |
237 return "ARG_SAME"; | 237 return "ARG_SAME"; |
238 } | 238 } |
239 }; | 239 }; |
240 | 240 |
241 private static final ArgConverter ARG_BOOLEAN = new ArgConverter() { | 241 private static final ArgConverter ARG_BOOLEAN = new ArgConverter() { |
242 public Object convert(Object obj) { | 242 public Object convert(LuanState luan,Object obj) { |
243 return Luan.toBoolean(obj); | 243 return Luan.toBoolean(obj); |
244 } | 244 } |
245 @Override public String toString() { | 245 @Override public String toString() { |
246 return "ARG_BOOLEAN"; | 246 return "ARG_BOOLEAN"; |
247 } | 247 } |
248 }; | 248 }; |
249 | 249 |
250 private static final ArgConverter ARG_BOOLEAN_OBJ = new ArgConverter() { | 250 private static final ArgConverter ARG_BOOLEAN_OBJ = new ArgConverter() { |
251 public Object convert(Object obj) { | 251 public Object convert(LuanState luan,Object obj) { |
252 return obj==null ? null : Luan.toBoolean(obj); | 252 return obj==null ? null : Luan.toBoolean(obj); |
253 } | 253 } |
254 @Override public String toString() { | 254 @Override public String toString() { |
255 return "ARG_BOOLEAN_OBJ"; | 255 return "ARG_BOOLEAN_OBJ"; |
256 } | 256 } |
257 }; | 257 }; |
258 | 258 |
259 private static final ArgConverter ARG_DOUBLE = new ArgConverter() { | 259 private static final ArgConverter ARG_DOUBLE = new ArgConverter() { |
260 public Object convert(Object obj) { | 260 public Object convert(LuanState luan,Object obj) { |
261 if( obj instanceof Double ) | 261 if( obj instanceof Double ) |
262 return obj; | 262 return obj; |
263 if( obj instanceof Number ) { | 263 if( obj instanceof Number ) { |
264 Number n = (Number)obj; | 264 Number n = (Number)obj; |
265 return n.doubleValue(); | 265 return n.doubleValue(); |
276 return "ARG_DOUBLE"; | 276 return "ARG_DOUBLE"; |
277 } | 277 } |
278 }; | 278 }; |
279 | 279 |
280 private static final ArgConverter ARG_FLOAT = new ArgConverter() { | 280 private static final ArgConverter ARG_FLOAT = new ArgConverter() { |
281 public Object convert(Object obj) { | 281 public Object convert(LuanState luan,Object obj) { |
282 if( obj instanceof Float ) | 282 if( obj instanceof Float ) |
283 return obj; | 283 return obj; |
284 if( obj instanceof Number ) { | 284 if( obj instanceof Number ) { |
285 Number n = (Number)obj; | 285 Number n = (Number)obj; |
286 return n.floatValue(); | 286 return n.floatValue(); |
297 return "ARG_FLOAT"; | 297 return "ARG_FLOAT"; |
298 } | 298 } |
299 }; | 299 }; |
300 | 300 |
301 private static final ArgConverter ARG_LONG = new ArgConverter() { | 301 private static final ArgConverter ARG_LONG = new ArgConverter() { |
302 public Object convert(Object obj) { | 302 public Object convert(LuanState luan,Object obj) { |
303 if( obj instanceof Long ) | 303 if( obj instanceof Long ) |
304 return obj; | 304 return obj; |
305 if( obj instanceof Number ) { | 305 if( obj instanceof Number ) { |
306 Number n = (Number)obj; | 306 Number n = (Number)obj; |
307 long r = n.longValue(); | 307 long r = n.longValue(); |
320 return "ARG_LONG"; | 320 return "ARG_LONG"; |
321 } | 321 } |
322 }; | 322 }; |
323 | 323 |
324 private static final ArgConverter ARG_INTEGER = new ArgConverter() { | 324 private static final ArgConverter ARG_INTEGER = new ArgConverter() { |
325 public Object convert(Object obj) { | 325 public Object convert(LuanState luan,Object obj) { |
326 if( obj instanceof Integer ) | 326 if( obj instanceof Integer ) |
327 return obj; | 327 return obj; |
328 if( obj instanceof Number ) { | 328 if( obj instanceof Number ) { |
329 Number n = (Number)obj; | 329 Number n = (Number)obj; |
330 int r = n.intValue(); | 330 int r = n.intValue(); |
343 return "ARG_INTEGER"; | 343 return "ARG_INTEGER"; |
344 } | 344 } |
345 }; | 345 }; |
346 | 346 |
347 private static final ArgConverter ARG_SHORT = new ArgConverter() { | 347 private static final ArgConverter ARG_SHORT = new ArgConverter() { |
348 public Object convert(Object obj) { | 348 public Object convert(LuanState luan,Object obj) { |
349 if( obj instanceof Short ) | 349 if( obj instanceof Short ) |
350 return obj; | 350 return obj; |
351 if( obj instanceof Number ) { | 351 if( obj instanceof Number ) { |
352 Number n = (Number)obj; | 352 Number n = (Number)obj; |
353 short r = n.shortValue(); | 353 short r = n.shortValue(); |
366 return "ARG_SHORT"; | 366 return "ARG_SHORT"; |
367 } | 367 } |
368 }; | 368 }; |
369 | 369 |
370 private static final ArgConverter ARG_BYTE = new ArgConverter() { | 370 private static final ArgConverter ARG_BYTE = new ArgConverter() { |
371 public Object convert(Object obj) { | 371 public Object convert(LuanState luan,Object obj) { |
372 if( obj instanceof Byte ) | 372 if( obj instanceof Byte ) |
373 return obj; | 373 return obj; |
374 if( obj instanceof Number ) { | 374 if( obj instanceof Number ) { |
375 Number n = (Number)obj; | 375 Number n = (Number)obj; |
376 byte r = n.byteValue(); | 376 byte r = n.byteValue(); |
389 return "ARG_BYTE"; | 389 return "ARG_BYTE"; |
390 } | 390 } |
391 }; | 391 }; |
392 | 392 |
393 private static final ArgConverter ARG_TABLE = new ArgConverter() { | 393 private static final ArgConverter ARG_TABLE = new ArgConverter() { |
394 public Object convert(Object obj) { | 394 public Object convert(LuanState luan,Object obj) { |
395 if( obj == null ) | 395 if( obj == null ) |
396 return null; | 396 return null; |
397 if( obj instanceof List ) { | 397 if( obj instanceof List ) { |
398 @SuppressWarnings("unchecked") | 398 @SuppressWarnings("unchecked") |
399 List<Object> list = (List<Object>)obj; | 399 List<Object> list = (List<Object>)obj; |
400 return new LuanTable(list); | 400 return new LuanTable(list); |
401 } | 401 } |
402 if( obj instanceof Map ) { | 402 if( obj instanceof Map ) { |
403 @SuppressWarnings("unchecked") | 403 @SuppressWarnings("unchecked") |
404 Map<Object,Object> map = (Map<Object,Object>)obj; | 404 Map<Object,Object> map = (Map<Object,Object>)obj; |
405 LuanTable tbl = new LuanTable(); | 405 return new LuanTable(map); |
406 for( Map.Entry<Object,Object> entry : map.entrySet() ) { | |
407 Object key = entry.getKey(); | |
408 Object value = entry.getValue(); | |
409 if( key != null && value != null ) | |
410 tbl.rawPut(key,value); | |
411 } | |
412 return tbl; | |
413 } | 406 } |
414 if( obj instanceof Set ) { | 407 if( obj instanceof Set ) { |
415 @SuppressWarnings("unchecked") | 408 @SuppressWarnings("unchecked") |
416 Set<Object> set = (Set<Object>)obj; | 409 Set<Object> set = (Set<Object>)obj; |
417 LuanTable tbl = new LuanTable(); | 410 return new LuanTable(set); |
418 for( Object el : set ) { | |
419 if( el != null ) | |
420 tbl.rawPut(el,Boolean.TRUE); | |
421 } | |
422 return tbl; | |
423 } | 411 } |
424 Class cls = obj.getClass(); | 412 Class cls = obj.getClass(); |
425 if( cls.isArray() && !cls.getComponentType().isPrimitive() ) { | 413 if( cls.isArray() && !cls.getComponentType().isPrimitive() ) { |
426 Object[] a = (Object[])obj; | 414 Object[] a = (Object[])obj; |
427 return new LuanTable(Arrays.asList(a)); | 415 return new LuanTable(Arrays.asList(a)); |
432 return "ARG_TABLE"; | 420 return "ARG_TABLE"; |
433 } | 421 } |
434 }; | 422 }; |
435 | 423 |
436 private static final ArgConverter ARG_MAP = new ArgConverter() { | 424 private static final ArgConverter ARG_MAP = new ArgConverter() { |
437 public Object convert(Object obj) { | 425 public Object convert(LuanState luan,Object obj) throws LuanException { |
438 if( obj instanceof LuanTable ) { | 426 if( obj instanceof LuanTable ) { |
439 LuanTable t = (LuanTable)obj; | 427 LuanTable t = (LuanTable)obj; |
440 return t.asMap(); | 428 return t.asMap(luan); |
441 } | 429 } |
442 return obj; | 430 return obj; |
443 } | 431 } |
444 @Override public String toString() { | 432 @Override public String toString() { |
445 return "ARG_MAP"; | 433 return "ARG_MAP"; |
446 } | 434 } |
447 }; | 435 }; |
448 | 436 |
449 private static final ArgConverter ARG_LIST = new ArgConverter() { | 437 private static final ArgConverter ARG_LIST = new ArgConverter() { |
450 public Object convert(Object obj) { | 438 public Object convert(LuanState luan,Object obj) { |
451 if( obj instanceof LuanTable ) { | 439 if( obj instanceof LuanTable ) { |
452 LuanTable t = (LuanTable)obj; | 440 LuanTable t = (LuanTable)obj; |
453 if( t.isList() ) | 441 if( t.isList() ) |
454 return t.asList(); | 442 return t.asList(); |
455 } | 443 } |
459 return "ARG_LIST"; | 447 return "ARG_LIST"; |
460 } | 448 } |
461 }; | 449 }; |
462 | 450 |
463 private static final ArgConverter ARG_SET = new ArgConverter() { | 451 private static final ArgConverter ARG_SET = new ArgConverter() { |
464 public Object convert(Object obj) { | 452 public Object convert(LuanState luan,Object obj) throws LuanException { |
465 if( obj instanceof LuanTable ) { | 453 if( obj instanceof LuanTable ) { |
466 LuanTable t = (LuanTable)obj; | 454 LuanTable t = (LuanTable)obj; |
467 if( t.isSet() ) | 455 if( t.isSet(luan) ) |
468 return t.asSet(); | 456 return t.asSet(luan); |
469 } | 457 } |
470 return obj; | 458 return obj; |
471 } | 459 } |
472 @Override public String toString() { | 460 @Override public String toString() { |
473 return "ARG_SET"; | 461 return "ARG_SET"; |
474 } | 462 } |
475 }; | 463 }; |
476 | 464 |
477 private static final ArgConverter ARG_COLLECTION = new ArgConverter() { | 465 private static final ArgConverter ARG_COLLECTION = new ArgConverter() { |
478 public Object convert(Object obj) { | 466 public Object convert(LuanState luan,Object obj) throws LuanException { |
479 if( obj instanceof LuanTable ) { | 467 if( obj instanceof LuanTable ) { |
480 LuanTable t = (LuanTable)obj; | 468 LuanTable t = (LuanTable)obj; |
481 if( t.isList() ) | 469 if( t.isList() ) |
482 return t.asList(); | 470 return t.asList(); |
483 if( t.isSet() ) | 471 if( t.isSet(luan) ) |
484 return t.asSet(); | 472 return t.asSet(luan); |
485 } | 473 } |
486 return obj; | 474 return obj; |
487 } | 475 } |
488 @Override public String toString() { | 476 @Override public String toString() { |
489 return "ARG_COLLECTION"; | 477 return "ARG_COLLECTION"; |
495 | 483 |
496 ArgArray(Class cls) { | 484 ArgArray(Class cls) { |
497 a = (Object[])Array.newInstance(cls.getComponentType(),0); | 485 a = (Object[])Array.newInstance(cls.getComponentType(),0); |
498 } | 486 } |
499 | 487 |
500 public Object convert(Object obj) { | 488 public Object convert(LuanState luan,Object obj) { |
501 if( obj instanceof LuanTable ) { | 489 if( obj instanceof LuanTable ) { |
502 LuanTable t = (LuanTable)obj; | 490 LuanTable t = (LuanTable)obj; |
503 if( t.isList() ) { | 491 if( t.isList() ) { |
504 try { | 492 try { |
505 return t.asList().toArray(a); | 493 return t.asList().toArray(a); |