diff src/luan/lib/BasicLib.java @ 19:a7c13c6017f7

add GenericForStmt git-svn-id: https://luan-java.googlecode.com/svn/trunk@20 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Sun, 02 Dec 2012 10:08:24 +0000
parents 2ddf85634d20
children c93d8c781853
line wrap: on
line diff
--- a/src/luan/lib/BasicLib.java	Sun Dec 02 07:00:44 2012 +0000
+++ b/src/luan/lib/BasicLib.java	Sun Dec 02 10:08:24 2012 +0000
@@ -2,6 +2,9 @@
 
 import java.io.FileReader;
 import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.Iterator;
+import java.util.Map;
 import org.parboiled.Parboiled;
 import org.parboiled.errors.ErrorUtils;
 import org.parboiled.parserunners.ReportingParseRunner;
@@ -10,6 +13,7 @@
 import luan.Lua;
 import luan.LuaState;
 import luan.LuaTable;
+import luan.LuaNumber;
 import luan.LuaFunction;
 import luan.LuaJavaFunction;
 import luan.LuaException;
@@ -24,6 +28,10 @@
 		LuaTable t = lua.env();
 		add( t, "print", new Object[0].getClass() );
 		add( t, "type", Object.class );
+		add( t, "load", String.class );
+		add( t, "loadFile", String.class );
+		add( t, "pairs", LuaTable.class );
+		add( t, "ipairs", LuaTable.class );
 	}
 
 	private static void add(LuaTable t,String method,Class<?>... parameterTypes) {
@@ -86,4 +94,55 @@
 		return load(readFile(fileName));
 	}
 
+	private static class TableIter {
+		private final Iterator<Map.Entry<Object,Object>> iter;
+
+		TableIter(LuaTable t) {
+			this.iter = t.map.entrySet().iterator();
+		}
+
+		public Object[] next() {
+			if( !iter.hasNext() )
+				return LuaFunction.EMPTY_RTN;
+			Map.Entry<Object,Object> entry = iter.next();
+			return new Object[]{entry.getKey(),entry.getValue()};
+		}
+	}
+
+	public static LuaFunction pairs(LuaTable t) {
+		try {
+			TableIter ti = new TableIter(t);
+			Method m = TableIter.class.getMethod("next");
+			m.setAccessible(true);
+			return new LuaJavaFunction(m,ti);
+		} catch(NoSuchMethodException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	private static class ArrayIter {
+		private final LuaTable t;
+		private double i = 0.0;
+
+		ArrayIter(LuaTable t) {
+			this.t = t;
+		}
+
+		public Object[] next() {
+			LuaNumber n = new LuaNumber(++i);
+			Object val = t.get(n);
+			return val==null ? LuaFunction.EMPTY_RTN : new Object[]{n,val};
+		}
+	}
+
+	public static LuaFunction ipairs(LuaTable t) {
+		try {
+			ArrayIter ai = new ArrayIter(t);
+			Method m = ArrayIter.class.getMethod("next");
+			m.setAccessible(true);
+			return new LuaJavaFunction(m,ai);
+		} catch(NoSuchMethodException e) {
+			throw new RuntimeException(e);
+		}
+	}
 }