diff src/luan/LuanJavaFunction.java @ 1335:e0cf0d108a77

major cleanup
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 14 Feb 2019 03:10:45 -0700
parents 25746915a241
children 71f067287642
line wrap: on
line diff
--- a/src/luan/LuanJavaFunction.java	Tue Feb 12 22:53:57 2019 -0700
+++ b/src/luan/LuanJavaFunction.java	Thu Feb 14 03:10:45 2019 -0700
@@ -17,30 +17,33 @@
 	private final JavaMethod method;
 	private Object obj;
 	private final RtnConverter rtnConverter;
-	private final boolean takesLuaState;
+	private final boolean takesLuan;
 	private final ArgConverter[] argConverters;
 	private final Class varArgCls;
 
-	public LuanJavaFunction(Method method,Object obj) {
-		this( JavaMethod.of(method), obj );
+	public LuanJavaFunction(Luan luan,Method method,Object obj) {
+		this( luan, JavaMethod.of(method), obj );
 	}
 
-	public LuanJavaFunction(Constructor constr,Object obj) {
-		this( JavaMethod.of(constr), obj );
+	public LuanJavaFunction(Luan luan,Constructor constr,Object obj) {
+		this( luan, JavaMethod.of(constr), obj );
 	}
 
-	private LuanJavaFunction(JavaMethod method,Object obj) {
+	private LuanJavaFunction(Luan luan,JavaMethod method,Object obj) {
+		super(luan);
 		this.method = method;
 		this.obj = obj;
 		this.rtnConverter = getRtnConverter(method);
-		this.takesLuaState = takesLuaState(method);
-		this.argConverters = getArgConverters(takesLuaState,method);
+		this.takesLuan = takesLuan(method);
+		this.argConverters = getArgConverters(takesLuan,method);
 		if( method.isVarArgs() ) {
 			Class[] paramTypes = method.getParameterTypes();
 			this.varArgCls = paramTypes[paramTypes.length-1].getComponentType();
 		} else {
 			this.varArgCls = null;
 		}
+		if( !takesLuan )
+			dontClone();
 	}
 
 	@Override public String toString() {
@@ -55,22 +58,22 @@
 		return method.isVarArgs();
 	}
 
-	@Override public Object call(Luan luan,Object[] args) throws LuanException {
+	@Override public Object call(Object[] args) throws LuanException {
 		try {
-			args = fixArgs(luan,args);
-			return doCall(luan,args);
+			args = fixArgs(args);
+			return doCall(args);
 		} catch(IllegalArgumentException e) {
 			checkArgs(args);
 			throw e;
 		}
 	}
 
-	public Object rawCall(Luan luan,Object[] args) throws LuanException {
-		args = fixArgs(luan,args);
-		return doCall(luan,args);
+	public Object rawCall(Object[] args) throws LuanException {
+		args = fixArgs(args);
+		return doCall(args);
 	}
 
-	private Object doCall(Luan luan,Object[] args) throws LuanException {
+	private Object doCall(Object[] args) throws LuanException {
 		Object rtn;
 		try {
 			rtn = method.invoke(obj,args);
@@ -86,7 +89,7 @@
 		} catch(InstantiationException e) {
 			throw new RuntimeException(e);
 		}
-		return rtnConverter.convert(luan,rtn);
+		return rtnConverter.convert(rtn);
 	}
 
 	private static final Map primitiveMap = new HashMap();
@@ -104,7 +107,7 @@
 
 	private void checkArgs(Object[] args) throws LuanException {
 		Class[] a = method.getParameterTypes();
-		int start = takesLuaState ? 1 : 0;
+		int start = takesLuan ? 1 : 0;
 		for( int i=start; i<a.length; i++ ) {
 			Class paramType = a[i];
 			Class type = paramType;
@@ -146,18 +149,18 @@
 		return type;
 	}
 
-	private Object[] fixArgs(Luan luan,Object[] args) throws LuanException {
+	private Object[] fixArgs(Object[] args) throws LuanException {
 		int n = argConverters.length;
 		Object[] rtn;
 		int start = 0;
-		if( !takesLuaState && varArgCls==null && args.length == n ) {
+		if( !takesLuan && varArgCls==null && args.length == n ) {
 			rtn = args;
 		} else {
-			if( takesLuaState )
+			if( takesLuan )
 				n++;
 			rtn = new Object[n];
-			if( takesLuaState ) {
-				rtn[start++] = luan;
+			if( takesLuan ) {
+				rtn[start++] = luan();
 			}
 			n = argConverters.length;
 			if( varArgCls == null ) {
@@ -174,7 +177,7 @@
 					Object varArgs = Array.newInstance(varArgCls,len);
 					ArgConverter ac = argConverters[n];
 					for( int i=0; i<len; i++ ) {
-						Array.set( varArgs, i, ac.convert(luan,args[n+i]) );
+						Array.set( varArgs, i, ac.convert(args[n+i]) );
 					}
 					rtn[rtn.length-1] = varArgs;
 				}
@@ -182,28 +185,28 @@
 			System.arraycopy(args,0,rtn,start,Math.min(args.length,n));
 		}
 		for( int i=0; i<n; i++ ) {
-			rtn[start+i] = argConverters[i].convert(luan,rtn[start+i]);
+			rtn[start+i] = argConverters[i].convert(rtn[start+i]);
 		}
 		return rtn;
 	}
 
 
 	private interface RtnConverter {
-		public Object convert(Luan luan,Object obj);
+		public Object convert(Object obj);
 	}
 
 	private static final RtnConverter RTN_NOTHING = new RtnConverter() {
-		@Override public Object[] convert(Luan luan,Object obj) {
+		@Override public Object[] convert(Object obj) {
 			return NOTHING;
 		}
 	};
 
 	private static final RtnConverter RTN_SAME = new RtnConverter() {
-		@Override public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			return obj;
 		}
 	};
-
+/*
 	private static final RtnConverter RTN_ARRAY = new RtnConverter() {
 		@Override public Object convert(Luan luan,Object obj) {
 			if( obj == null )
@@ -215,23 +218,25 @@
 			return new LuanTable(luan,new ArrayList<Object>(Arrays.asList(a)));
 		}
 	};
-
+*/
 	private static RtnConverter getRtnConverter(JavaMethod m) {
 		Class rtnType = m.getReturnType();
 		if( rtnType == Void.TYPE )
 			return RTN_NOTHING;
+/*
 		if( !m.isLuan() && rtnType.isArray() && !rtnType.getComponentType().isPrimitive() ) {
 			return RTN_ARRAY;
 		}
+*/
 		return RTN_SAME;
 	}
 
 	private interface ArgConverter {
-		public Object convert(Luan luan,Object obj) throws LuanException;
+		public Object convert(Object obj) throws LuanException;
 	}
 
 	private static final ArgConverter ARG_SAME = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			return obj;
 		}
 		@Override public String toString() {
@@ -240,7 +245,7 @@
 	};
 
 	private static final ArgConverter ARG_DOUBLE = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			if( obj instanceof Double )
 				return obj;
 			if( obj instanceof Number ) {
@@ -255,7 +260,7 @@
 	};
 
 	private static final ArgConverter ARG_FLOAT = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			if( obj instanceof Float )
 				return obj;
 			if( obj instanceof Number ) {
@@ -270,7 +275,7 @@
 	};
 
 	private static final ArgConverter ARG_LONG = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			if( obj instanceof Long )
 				return obj;
 			if( obj instanceof Number ) {
@@ -287,7 +292,7 @@
 	};
 
 	private static final ArgConverter ARG_INTEGER = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			if( obj instanceof Integer )
 				return obj;
 			if( obj instanceof Number ) {
@@ -304,7 +309,7 @@
 	};
 
 	private static final ArgConverter ARG_SHORT = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			if( obj instanceof Short )
 				return obj;
 			if( obj instanceof Number ) {
@@ -321,7 +326,7 @@
 	};
 
 	private static final ArgConverter ARG_BYTE = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			if( obj instanceof Byte )
 				return obj;
 			if( obj instanceof Number ) {
@@ -336,9 +341,9 @@
 			return "ARG_BYTE";
 		}
 	};
-
+/*
 	private static final ArgConverter ARG_TABLE = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Luan luan,Object obj) {
 			LuanTable tbl = luan.toTable(obj);
 			return tbl!=null ? tbl : obj;
 		}
@@ -346,9 +351,9 @@
 			return "ARG_TABLE";
 		}
 	};
-
+*/
 	private static final ArgConverter ARG_MAP = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) throws LuanException {
+		@Override public Object convert(Object obj) throws LuanException {
 			if( obj instanceof LuanTable ) {
 				LuanTable t = (LuanTable)obj;
 				return t.asMap();
@@ -361,7 +366,7 @@
 	};
 
 	private static final ArgConverter ARG_LIST = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			if( obj instanceof LuanTable ) {
 				LuanTable t = (LuanTable)obj;
 				if( t.isList() )
@@ -375,7 +380,7 @@
 	};
 
 	private static final ArgConverter ARG_SET = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) throws LuanException {
+		@Override public Object convert(Object obj) throws LuanException {
 			if( obj instanceof LuanTable ) {
 				LuanTable t = (LuanTable)obj;
 				if( t.isSet() )
@@ -389,7 +394,7 @@
 	};
 
 	private static final ArgConverter ARG_COLLECTION = new ArgConverter() {
-		public Object convert(Luan luan,Object obj) throws LuanException {
+		@Override public Object convert(Object obj) throws LuanException {
 			if( obj instanceof LuanTable ) {
 				LuanTable t = (LuanTable)obj;
 				if( t.isList() )
@@ -411,7 +416,7 @@
 			a = (Object[])Array.newInstance(cls.getComponentType(),0);
 		}
 
-		public Object convert(Luan luan,Object obj) {
+		@Override public Object convert(Object obj) {
 			if( obj instanceof LuanTable ) {
 				LuanTable t = (LuanTable)obj;
 				if( t.isList() ) {
@@ -424,15 +429,15 @@
 		}
 	}
 
-	private static boolean takesLuaState(JavaMethod m) {
+	private static boolean takesLuan(JavaMethod m) {
 		Class[] paramTypes = m.getParameterTypes();
 		return paramTypes.length > 0 && paramTypes[0].equals(Luan.class);
 	}
 
-	private static ArgConverter[] getArgConverters(boolean takesLuaState,JavaMethod m) {
+	private static ArgConverter[] getArgConverters(boolean takesLuan,JavaMethod m) {
 		final boolean isVarArgs = m.isVarArgs();
 		Class[] paramTypes = m.getParameterTypes();
-		if( takesLuaState ) {
+		if( takesLuan ) {
 			Class[] t = new Class[paramTypes.length-1];
 			System.arraycopy(paramTypes,1,t,0,t.length);
 			paramTypes = t;
@@ -460,8 +465,8 @@
 			return ARG_SHORT;
 		if( cls == Byte.TYPE || cls.equals(Byte.class) )
 			return ARG_BYTE;
-		if( cls.equals(LuanTable.class) )
-			return ARG_TABLE;
+//		if( cls.equals(LuanTable.class) )
+//			return ARG_TABLE;
 		if( cls.equals(Map.class) )
 			return ARG_MAP;
 		if( cls.equals(List.class) )
@@ -483,7 +488,7 @@
 		abstract Object invoke(Object obj,Object... args)
 			throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException;
 		abstract Class getReturnType();
-		abstract boolean isLuan();
+		abstract String getName();
 	
 		static JavaMethod of(final Method m) {
 			return new JavaMethod() {
@@ -501,8 +506,8 @@
 				@Override Class getReturnType() {
 					return m.getReturnType();
 				}
-				@Override boolean isLuan() {
-					return m.getAnnotation(LuanMethod.class) != null;
+				@Override public String getName() {
+					return m.getName();
 				}
 				@Override public String toString() {
 					return m.toString();
@@ -526,8 +531,8 @@
 				@Override Class getReturnType() {
 					return c.getDeclaringClass();
 				}
-				@Override boolean isLuan() {
-					return false;
+				@Override public String getName() {
+					return c.getName();
 				}
 				@Override public String toString() {
 					return c.toString();