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