Mercurial Hosting > luan
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)); |