Mercurial Hosting > luan
diff src/luan/LuaJavaFunction.java @ 21:c93d8c781853
add functions
git-svn-id: https://luan-java.googlecode.com/svn/trunk@22 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Tue, 04 Dec 2012 09:16:03 +0000 |
parents | 9cea1aea5eef |
children | 8a57ebfdfd78 |
line wrap: on
line diff
--- a/src/luan/LuaJavaFunction.java Sun Dec 02 10:51:18 2012 +0000 +++ b/src/luan/LuaJavaFunction.java Tue Dec 04 09:16:03 2012 +0000 @@ -9,6 +9,7 @@ private final Method method; private final Object obj; private final RtnConverter rtnConverter; + private final boolean takesLuaState; private final ArgConverter[] argConverters; private final Class<?> varArgCls; @@ -16,7 +17,8 @@ this.method = method; this.obj = obj; this.rtnConverter = getRtnConverter(method); - this.argConverters = getArgConverters(method); + this.takesLuaState = takesLuaState(method); + this.argConverters = getArgConverters(takesLuaState,method); if( method.isVarArgs() ) { Class<?>[] paramTypes = method.getParameterTypes(); this.varArgCls = paramTypes[paramTypes.length-1].getComponentType(); @@ -26,7 +28,7 @@ } @Override public Object[] call(LuaState lua,Object... args) { - args = fixArgs(args); + args = fixArgs(lua,args); Object rtn; try { rtn = method.invoke(obj,args); @@ -38,37 +40,39 @@ return rtnConverter.convert(rtn); } - private Object[] fixArgs(Object[] args) { - if( varArgCls==null ) { - if( args.length != argConverters.length ) { - Object[] t = new Object[argConverters.length]; - System.arraycopy(args,0,t,0,Math.min(args.length,t.length)); - args = t; - } - for( int i=0; i<args.length; i++ ) { - args[i] = argConverters[i].convert(args[i]); + private Object[] fixArgs(LuaState lua,Object[] args) { + int n = argConverters.length; + Object[] rtn; + int start = 0; + if( !takesLuaState && varArgCls==null && args.length == n ) { + rtn = args; + } else { + if( takesLuaState ) + n++; + rtn = new Object[n]; + if( takesLuaState ) { + rtn[start++] = lua; } - return args; - } else { // varargs - Object[] rtn = new Object[argConverters.length]; - int n = argConverters.length - 1; - if( args.length < argConverters.length ) { - System.arraycopy(args,0,rtn,0,args.length); - rtn[rtn.length-1] = Array.newInstance(varArgCls,0); - } else { - System.arraycopy(args,0,rtn,0,n); - Object[] varArgs = (Object[])Array.newInstance(varArgCls,args.length-n); - ArgConverter ac = argConverters[n]; - for( int i=0; i<varArgs.length; i++ ) { - varArgs[i] = ac.convert(args[n+i]); + n = argConverters.length; + if( varArgCls != null ) { + n--; + if( args.length < argConverters.length ) { + rtn[rtn.length-1] = Array.newInstance(varArgCls,0); + } else { + Object[] varArgs = (Object[])Array.newInstance(varArgCls,args.length-n); + ArgConverter ac = argConverters[n]; + for( int i=0; i<varArgs.length; i++ ) { + varArgs[i] = ac.convert(args[n+i]); + } + rtn[rtn.length-1] = varArgs; } - rtn[rtn.length-1] = varArgs; } - for( int i=0; i<n; i++ ) { - rtn[i] = argConverters[i].convert(rtn[i]); - } - return rtn; + System.arraycopy(args,0,rtn,start,Math.min(args.length,n)); } + for( int i=0; i<n; i++ ) { + rtn[start+i] = argConverters[i].convert(rtn[start+i]); + } + return rtn; } @@ -218,9 +222,19 @@ } }; - private static ArgConverter[] getArgConverters(Method m) { + private static boolean takesLuaState(Method m) { + Class<?>[] paramTypes = m.getParameterTypes(); + return paramTypes.length > 0 && paramTypes[0].equals(LuaState.class); + } + + private static ArgConverter[] getArgConverters(boolean takesLuaState,Method m) { final boolean isVarArgs = m.isVarArgs(); Class<?>[] paramTypes = m.getParameterTypes(); + if( takesLuaState ) { + Class<?>[] t = new Class<?>[paramTypes.length-1]; + System.arraycopy(paramTypes,1,t,0,t.length); + paramTypes = t; + } ArgConverter[] a = new ArgConverter[paramTypes.length]; for( int i=0; i<a.length; i++ ) { Class<?> paramType = paramTypes[i];