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