comparison src/luan/modules/JavaLuan.java @ 1120:e8fc6712b468

luan Rpc uses luan.lib.rpc
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 07 Aug 2017 23:50:52 -0600
parents dd36eae6aa04
children ba4daf107e07
comparison
equal deleted inserted replaced
1119:87c674f3f6b7 1120:e8fc6712b468
14 import java.util.List; 14 import java.util.List;
15 import java.util.ArrayList; 15 import java.util.ArrayList;
16 import java.util.Iterator; 16 import java.util.Iterator;
17 import java.util.Collections; 17 import java.util.Collections;
18 import java.util.Arrays; 18 import java.util.Arrays;
19 import java.util.Comparator;
19 import luan.Luan; 20 import luan.Luan;
20 import luan.LuanState; 21 import luan.LuanState;
21 import luan.LuanTable; 22 import luan.LuanTable;
22 import luan.LuanException; 23 import luan.LuanException;
23 import luan.LuanFunction; 24 import luan.LuanFunction;
353 } 354 }
354 } 355 }
355 return new Static(cls); 356 return new Static(cls);
356 } 357 }
357 358
359 private static final Comparator<LuanJavaFunction> varArgsSorter = new Comparator<LuanJavaFunction>() {
360 public int compare(LuanJavaFunction fn1,LuanJavaFunction fn2) {
361 return fn2.getParameterCount() - fn1.getParameterCount();
362 }
363 };
364
358 private static class AmbiguousJavaFunction extends LuanFunction { 365 private static class AmbiguousJavaFunction extends LuanFunction {
359 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>(); 366 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>();
367 private List<LuanJavaFunction> varArgs = new ArrayList<LuanJavaFunction>();
360 368
361 AmbiguousJavaFunction(List<LuanJavaFunction> fns) { 369 AmbiguousJavaFunction(List<LuanJavaFunction> fns) {
362 for( LuanJavaFunction fn : fns ) { 370 for( LuanJavaFunction fn : fns ) {
363 Integer n = fn.getParameterCount(); 371 if( fn.isVarArgs() ) {
364 List<LuanJavaFunction> list = fnMap.get(n); 372 varArgs.add(fn);
365 if( list==null ) { 373 } else {
366 list = new ArrayList<LuanJavaFunction>(); 374 Integer n = fn.getParameterCount();
367 fnMap.put(n,list); 375 List<LuanJavaFunction> list = fnMap.get(n);
368 } 376 if( list==null ) {
369 list.add(fn); 377 list = new ArrayList<LuanJavaFunction>();
370 } 378 fnMap.put(n,list);
379 }
380 list.add(fn);
381 }
382 }
383 Collections.sort(varArgs,varArgsSorter);
371 } 384 }
372 385
373 @Override public Object call(LuanState luan,Object[] args) throws LuanException { 386 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
374 for( LuanJavaFunction fn : fnMap.get(args.length) ) { 387 List<LuanJavaFunction> list = fnMap.get(args.length);
388 if( list != null ) {
389 for( LuanJavaFunction fn : list ) {
390 try {
391 return fn.rawCall(luan,args);
392 } catch(IllegalArgumentException e) {}
393 }
394 }
395 for( LuanJavaFunction fn : varArgs ) {
375 try { 396 try {
376 return fn.rawCall(luan,args); 397 return fn.rawCall(luan,args);
377 } catch(IllegalArgumentException e) {} 398 } catch(IllegalArgumentException e) {}
378 } 399 }
379 throw new LuanException("no method matched args: "+Arrays.asList(args)); 400 throw new LuanException("no method matched args: "+Arrays.asList(args));