diff src/luan/LuaJavaFunction.java @ 43:80b67b1a653c

implement string lib git-svn-id: https://luan-java.googlecode.com/svn/trunk@44 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Tue, 25 Dec 2012 03:42:42 +0000
parents e3624b7cd603
children 57054fa43189
line wrap: on
line diff
--- a/src/luan/LuaJavaFunction.java	Sun Dec 23 06:36:56 2012 +0000
+++ b/src/luan/LuaJavaFunction.java	Tue Dec 25 03:42:42 2012 +0000
@@ -81,10 +81,11 @@
 				if( args.length < argConverters.length ) {
 					rtn[rtn.length-1] = Array.newInstance(varArgCls,0);
 				} else {
-					Object[] varArgs = (Object[])Array.newInstance(varArgCls,args.length-n);
+					int len = args.length - n;
+					Object varArgs = Array.newInstance(varArgCls,len);
 					ArgConverter ac = argConverters[n];
-					for( int i=0; i<varArgs.length; i++ ) {
-						varArgs[i] = ac.convert(args[n+i]);
+					for( int i=0; i<len; i++ ) {
+						Array.set( varArgs, i, ac.convert(args[n+i]) );
 					}
 					rtn[rtn.length-1] = varArgs;
 				}
@@ -110,6 +111,8 @@
 
 	private static final RtnConverter RTN_ARRAY = new RtnConverter() {
 		public Object[] convert(Object obj) {
+			if( obj == null )
+				return NULL_RTN;
 			return (Object[])obj;
 		}
 	};
@@ -120,31 +123,56 @@
 		}
 	};
 
+	private static final Object[] NULL_RTN = new Object[1];
+
 	private static final RtnConverter RTN_NUMBER = new RtnConverter() {
 		public Object[] convert(Object obj) {
 			if( obj == null )
-				return new Object[1];
+				return NULL_RTN;
 			Number n = (Number)obj;
 			LuaNumber ln = new LuaNumber(n.doubleValue());
 			return new Object[]{ln};
 		}
 	};
 
+	private static final RtnConverter RTN_NUMBER_ARRAY = new RtnConverter() {
+		public Object[] convert(Object obj) {
+			if( obj == null )
+				return NULL_RTN;
+			Object[] rtn = new Object[Array.getLength(obj)];
+			for( int i=0; i<rtn.length; i++ ) {
+				Number n = (Number)Array.get(obj,i);
+				if( n != null )
+					rtn[i] = new LuaNumber(n.doubleValue());
+			}
+			return rtn;
+		}
+	};
+
 	private static RtnConverter getRtnConverter(JavaMethod m) {
 		Class<?> rtnType = m.getReturnType();
 		if( rtnType == Void.TYPE )
 			return RTN_EMPTY;
-		if( Number.class.isAssignableFrom(rtnType)
+		if( isNumber(rtnType) )
+			return RTN_NUMBER;
+		if( rtnType.isArray() ) {
+			rtnType = rtnType.getComponentType();
+			if( isNumber(rtnType) )
+				return RTN_NUMBER_ARRAY;
+			return RTN_ARRAY;
+		}
+		return RTN_ONE;
+	}
+
+	private static boolean isNumber(Class<?> rtnType) {
+		return Number.class.isAssignableFrom(rtnType)
+			|| rtnType == Byte.TYPE
 			|| rtnType == Short.TYPE
 			|| rtnType == Integer.TYPE
 			|| rtnType == Long.TYPE
 			|| rtnType == Float.TYPE
 			|| rtnType == Double.TYPE
-		)
-			return RTN_NUMBER;
-		if( rtnType.isArray() )
-			return RTN_ARRAY;
-		return RTN_ONE;
+		;
 	}
 
 
@@ -244,6 +272,24 @@
 		}
 	};
 
+	private static final ArgConverter ARG_BYTE = new ArgConverter() {
+		public Object convert(Object obj) {
+			if( obj instanceof LuaNumber ) {
+				LuaNumber ln = (LuaNumber)obj;
+				byte i = (byte)ln.n;
+				if( i == ln.n )
+					return Byte.valueOf(i);
+			}
+			else if( obj instanceof String ) {
+				String s = (String)obj;
+				try {
+					return Byte.valueOf(s);
+				} catch(NumberFormatException e) {}
+			}
+			return obj;
+		}
+	};
+
 	private static boolean takesLuaState(JavaMethod m) {
 		Class<?>[] paramTypes = m.getParameterTypes();
 		return paramTypes.length > 0 && paramTypes[0].equals(LuaState.class);
@@ -278,6 +324,8 @@
 			return ARG_INTEGER;
 		if( cls == Short.TYPE || cls.equals(Short.class) )
 			return ARG_SHORT;
+		if( cls == Byte.TYPE || cls.equals(Byte.class) )
+			return ARG_BYTE;
 		return ARG_SAME;
 	}
 
@@ -292,39 +340,45 @@
 	
 		static JavaMethod of(final Method m) {
 			return new JavaMethod() {
-				boolean isVarArgs() {
+				@Override boolean isVarArgs() {
 					return m.isVarArgs();
 				}
-				Class<?>[] getParameterTypes() {
+				@Override Class<?>[] getParameterTypes() {
 					return m.getParameterTypes();
 				}
-				Object invoke(Object obj,Object... args)
+				@Override Object invoke(Object obj,Object... args)
 					throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
 				{
 					return m.invoke(obj,args);
 				}
-				Class<?> getReturnType() {
+				@Override Class<?> getReturnType() {
 					return m.getReturnType();
 				}
+				@Override public String toString() {
+					return m.toString();
+				}
 			};
 		}
 	
 		static JavaMethod of(final Constructor c) {
 			return new JavaMethod() {
-				boolean isVarArgs() {
+				@Override boolean isVarArgs() {
 					return c.isVarArgs();
 				}
-				Class<?>[] getParameterTypes() {
+				@Override Class<?>[] getParameterTypes() {
 					return c.getParameterTypes();
 				}
-				Object invoke(Object obj,Object... args)
+				@Override Object invoke(Object obj,Object... args)
 					throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException
 				{
 					return c.newInstance(args);
 				}
-				Class<?> getReturnType() {
+				@Override Class<?> getReturnType() {
 					return c.getDeclaringClass();
 				}
+				@Override public String toString() {
+					return c.toString();
+				}
 			};
 		}