Mercurial Hosting > luan
diff 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 |
line wrap: on
line diff
--- a/src/luan/modules/JavaLuan.java Mon Aug 07 12:35:45 2017 -0600 +++ b/src/luan/modules/JavaLuan.java Mon Aug 07 23:50:52 2017 -0600 @@ -16,6 +16,7 @@ import java.util.Iterator; import java.util.Collections; import java.util.Arrays; +import java.util.Comparator; import luan.Luan; import luan.LuanState; import luan.LuanTable; @@ -355,23 +356,43 @@ return new Static(cls); } + private static final Comparator<LuanJavaFunction> varArgsSorter = new Comparator<LuanJavaFunction>() { + public int compare(LuanJavaFunction fn1,LuanJavaFunction fn2) { + return fn2.getParameterCount() - fn1.getParameterCount(); + } + }; + private static class AmbiguousJavaFunction extends LuanFunction { private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>(); + private List<LuanJavaFunction> varArgs = new ArrayList<LuanJavaFunction>(); AmbiguousJavaFunction(List<LuanJavaFunction> fns) { for( LuanJavaFunction fn : fns ) { - Integer n = fn.getParameterCount(); - List<LuanJavaFunction> list = fnMap.get(n); - if( list==null ) { - list = new ArrayList<LuanJavaFunction>(); - fnMap.put(n,list); + if( fn.isVarArgs() ) { + varArgs.add(fn); + } else { + Integer n = fn.getParameterCount(); + List<LuanJavaFunction> list = fnMap.get(n); + if( list==null ) { + list = new ArrayList<LuanJavaFunction>(); + fnMap.put(n,list); + } + list.add(fn); } - list.add(fn); } + Collections.sort(varArgs,varArgsSorter); } @Override public Object call(LuanState luan,Object[] args) throws LuanException { - for( LuanJavaFunction fn : fnMap.get(args.length) ) { + List<LuanJavaFunction> list = fnMap.get(args.length); + if( list != null ) { + for( LuanJavaFunction fn : list ) { + try { + return fn.rawCall(luan,args); + } catch(IllegalArgumentException e) {} + } + } + for( LuanJavaFunction fn : varArgs ) { try { return fn.rawCall(luan,args); } catch(IllegalArgumentException e) {}