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) {}