diff src/luan/LuanJavaFunction.java @ 111:2428ecfed375

change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection git-svn-id: https://luan-java.googlecode.com/svn/trunk@112 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Fri, 23 May 2014 20:40:05 +0000
parents 3a0ff21f0c96
children 8c706d6eb5dc
line wrap: on
line diff
--- a/src/luan/LuanJavaFunction.java	Fri May 23 04:36:47 2014 +0000
+++ b/src/luan/LuanJavaFunction.java	Fri May 23 20:40:05 2014 +0000
@@ -49,7 +49,7 @@
 		return method.getParameterTypes();
 	}
 
-	@Override public Object[] call(LuanState luan,Object[] args) throws LuanException {
+	@Override public Object call(LuanState luan,Object[] args) throws LuanException {
 		args = fixArgs(luan,args);
 		try {
 			return doCall(luan,args);
@@ -59,12 +59,12 @@
 		}
 	}
 
-	public Object[] rawCall(LuanState luan,Object[] args) throws LuanException {
+	public Object rawCall(LuanState luan,Object[] args) throws LuanException {
 		args = fixArgs(luan,args);
 		return doCall(luan,args);
 	}
 
-	private Object[] doCall(LuanState luan,Object[] args) throws LuanException {
+	private Object doCall(LuanState luan,Object[] args) throws LuanException {
 		Object rtn;
 		try {
 			rtn = method.invoke(obj,args);
@@ -158,35 +158,25 @@
 
 
 	private interface RtnConverter {
-		public Object[] convert(Object obj);
+		public Object convert(Object obj);
 	}
 
 	private static final RtnConverter RTN_EMPTY = new RtnConverter() {
-		public Object[] convert(Object obj) {
+		@Override public Object[] convert(Object obj) {
 			return EMPTY;
 		}
 	};
 
-	private static final RtnConverter RTN_ARRAY = new RtnConverter() {
-		public Object[] convert(Object obj) {
-			if( obj == null )
-				return NULL_RTN;
-			return (Object[])obj;
+	private static final RtnConverter RTN_SAME = new RtnConverter() {
+		@Override public Object convert(Object obj) {
+			return obj;
 		}
 	};
 
-	private static final RtnConverter RTN_ONE = new RtnConverter() {
-		public Object[] convert(Object obj) {
-			return new Object[]{obj};
-		}
-	};
-
-	private static final Object[] NULL_RTN = new Object[1];
-
 	private static final RtnConverter RTN_NUMBER_ARRAY = new RtnConverter() {
-		public Object[] convert(Object obj) {
+		@Override public Object convert(Object obj) {
 			if( obj == null )
-				return NULL_RTN;
+				return null;
 			Object[] rtn = new Object[Array.getLength(obj)];
 			for( int i=0; i<rtn.length; i++ ) {
 				rtn[i] = Array.get(obj,i);
@@ -199,13 +189,9 @@
 		Class<?> rtnType = m.getReturnType();
 		if( rtnType == Void.TYPE )
 			return RTN_EMPTY;
-		if( rtnType.isArray() ) {
-			rtnType = rtnType.getComponentType();
-			if( isNumber(rtnType) )
-				return RTN_NUMBER_ARRAY;
-			return RTN_ARRAY;
-		}
-		return RTN_ONE;
+		if( rtnType.isArray() && isNumber(rtnType.getComponentType()) )
+			return RTN_NUMBER_ARRAY;
+		return RTN_SAME;
 	}
 
 	private static boolean isNumber(Class<?> rtnType) {