diff core/src/luan/modules/BasicLuan.java @ 221:ec016471c6eb

make LuanTable an interface git-svn-id: https://luan-java.googlecode.com/svn/trunk@222 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 17 Jul 2014 07:49:26 +0000
parents 75750ceb45ee
children ef39bc4d3f70
line wrap: on
line diff
--- a/core/src/luan/modules/BasicLuan.java	Wed Jul 16 04:59:45 2014 +0000
+++ b/core/src/luan/modules/BasicLuan.java	Thu Jul 17 07:49:26 2014 +0000
@@ -22,7 +22,7 @@
 
 	public static final LuanFunction LOADER = new LuanFunction() {
 		@Override public Object call(LuanState luan,Object[] args) {
-			LuanTable module = new LuanTable();
+			LuanTable module = Luan.newTable();
 			try {
 				module.put( "assert", new LuanJavaFunction(BasicLuan.class.getMethod("assert_",LuanState.class,Object.class,String.class),null) );
 				add( module, "assert_boolean", LuanState.class, Boolean.TYPE );
@@ -85,8 +85,11 @@
 		return luan.call(fn);
 	}
 
-	private static LuanFunction pairs(final Iterator<Map.Entry<Object,Object>> iter) {
+	public static LuanFunction pairs(LuanState luan,final LuanTable t) throws LuanException {
+		Utils.checkNotNull(luan,t,"table");
 		return new LuanFunction() {
+			Iterator<Map.Entry<Object,Object>> iter = t.iterator();
+
 			@Override public Object[] call(LuanState luan,Object[] args) {
 				if( !iter.hasNext() )
 					return LuanFunction.NOTHING;
@@ -96,14 +99,20 @@
 		};
 	}
 
-	public static LuanFunction pairs(LuanState luan,LuanTable t) throws LuanException {
+	public static LuanFunction ipairs(LuanState luan,final LuanTable t) throws LuanException {
 		Utils.checkNotNull(luan,t,"table");
-		return pairs( t.iterator() );
-	}
+		return new LuanFunction() {
+			List<Object> list = t.asList();
+			int i = 0;
+			final int size = list.size();
 
-	public static LuanFunction ipairs(LuanState luan,LuanTable t) throws LuanException {
-		Utils.checkNotNull(luan,t,"table");
-		return pairs( t.listIterator() );
+			@Override public Object[] call(LuanState luan,Object[] args) {
+				if( i >= size )
+					return LuanFunction.NOTHING;
+				Object val = list.get(i++);
+				return new Object[]{i,val};
+			}
+		};
 	}
 
 	public static LuanTable get_metatable(LuanState luan,Object obj) {