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