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