diff src/luan/modules/BasicLuan.java @ 1335:e0cf0d108a77

major cleanup
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 14 Feb 2019 03:10:45 -0700
parents c88b486a9511
children b3c4fcf29a53
line wrap: on
line diff
--- a/src/luan/modules/BasicLuan.java	Tue Feb 12 22:53:57 2019 -0700
+++ b/src/luan/modules/BasicLuan.java	Thu Feb 14 03:10:45 2019 -0700
@@ -12,7 +12,7 @@
 import luan.LuanTable;
 import luan.LuanFunction;
 import luan.LuanException;
-import luan.LuanMethod;
+import luan.LuanCloner;
 import luan.modules.parsers.LuanToString;
 
 
@@ -22,12 +22,12 @@
 		return Luan.type(obj);
 	}
 
-	public static LuanFunction load(String text,String sourceName,LuanTable env)
+	public static LuanFunction load(Luan luan,String text,String sourceName,LuanTable env)
 		throws LuanException
 	{
 		Utils.checkNotNull(text);
 		Utils.checkNotNull(sourceName,1);
-		return Luan.load(text,sourceName,env);
+		return luan.load(text,sourceName,env);
 	}
 
 	public static LuanFunction load_file(Luan luan,String fileName) throws LuanException {
@@ -39,7 +39,7 @@
 		String src = PackageLuan.read(luan,fileName);
 		if( src == null )
 			return null;
-		return load(src,fileName,null);
+		return load(luan,src,fileName,null);
 	}
 
 	public static LuanFunction pairs(final LuanTable t) throws LuanException {
@@ -47,20 +47,34 @@
 		return t.pairs();
 	}
 
-	public static LuanFunction ipairs(final LuanTable t) throws LuanException {
-		Utils.checkNotNull(t);
-		return new LuanFunction() {
-			List<Object> list = t.asList();
-			int i = 0;
-			final int size = list.size();
+	private static class Ipairs extends LuanFunction {
+		List<Object> list;
+		int i = 0;
+		final int size;
+
+		Ipairs(LuanTable t) {
+			super(true);
+			list = t.asList();
+			size = list.size();
+		}
 
-			@Override public Object[] call(Luan luan,Object[] args) {
-				if( i >= size )
-					return LuanFunction.NOTHING;
-				Object val = list.get(i++);
-				return new Object[]{i,val};
-			}
-		};
+		@Override public Object[] call(Object[] args) {
+			if( i >= size )
+				return LuanFunction.NOTHING;
+			Object val = list.get(i++);
+			return new Object[]{i,val};
+		}
+
+		@Override protected void completeClone(LuanFunction dc,LuanCloner cloner) {
+			Ipairs clone = (Ipairs)dc;
+			clone.list = (List)cloner.clone(list);
+			super.completeClone(dc,cloner);
+		}
+	}
+
+	public static LuanFunction ipairs(LuanTable t) throws LuanException {
+		Utils.checkNotNull(t);
+		return new Ipairs(t);
 	}
 
 	public static Object get_metatable(LuanTable table) throws LuanException {
@@ -134,10 +148,10 @@
 		final double step = stepV==null ? 1.0 : stepV;
 		if( step == 0.0 )
 			throw new LuanException("bad argument #3 (step may not be zero)");
-		return new LuanFunction() {
+		return new LuanFunction(false) {
 			double v = from;
 
-			@Override public Object call(Luan luan,Object[] args) {
+			@Override public Object call(Object[] args) {
 				if( step > 0.0 && v > to || step < 0.0 && v < to )
 					return LuanFunction.NOTHING;
 				double rtn = v;
@@ -147,24 +161,38 @@
 		};
 	}
 
-	public static LuanFunction values(final Object... args) throws LuanException {
-		return new LuanFunction() {
-			int i = 0;
+	private static class Values extends LuanFunction {
+		Object[] args;
+		int i = 0;
+
+		Values(Object[] args) {
+			super(true);
+			this.args = args;
+		}
 
-			@Override public Object call(Luan luan,Object[] unused) {
-				if( i >= args.length )
-					return LuanFunction.NOTHING;
-				Object val = args[i++];
-				return new Object[]{i,val};
-			}
-		};
+		@Override public Object[] call(Object[] args) {
+			if( i >= args.length )
+				return LuanFunction.NOTHING;
+			Object val = args[i++];
+			return new Object[]{i,val};
+		}
+
+		@Override protected void completeClone(LuanFunction dc,LuanCloner cloner) {
+			Values clone = (Values)dc;
+			clone.args = (Object[])cloner.clone(args);
+			super.completeClone(dc,cloner);
+		}
+	}
+
+	public static LuanFunction values(final Object... args) throws LuanException {
+		return new Values(args);
 	}
 
 	private LuanFunction fn(Object obj) {
 		return obj instanceof LuanFunction ? (LuanFunction)obj : null;
 	}
 
-	public static Object try_(Luan luan,LuanTable blocks,Object... args) throws LuanException {
+	public static Object try_(LuanTable blocks,Object... args) throws LuanException {
 		Utils.checkNotNull(blocks);
 		Object obj = blocks.get(1);
 		if( obj == null )
@@ -187,20 +215,20 @@
 			finallyFn = (LuanFunction)obj;
 		}
 		try {
-			return tryFn.call(luan,args);
+			return tryFn.call(args);
 		} catch(LuanException e) {
 			if( catchFn == null )
 				throw e;
-			return catchFn.call(luan,new Object[]{e.table(luan)});
+			return catchFn.call(e.table(blocks.luan()));
 		} finally {
 			if( finallyFn != null )
-				finallyFn.call(luan);
+				finallyFn.call();
 		}
 	}
 
-	@LuanMethod public static Object[] pcall(Luan luan,LuanFunction f,Object... args) {
+	public static Object[] pcall(LuanFunction f,Object... args) {
 		try {
-			Object[] r = Luan.array(f.call(luan,args));
+			Object[] r = Luan.array(f.call(args));
 			Object[] rtn = new Object[r.length+1];
 			rtn[0] = true;
 			for( int i=0; i<r.length; i++ ) {
@@ -208,7 +236,7 @@
 			}
 			return rtn;
 		} catch(LuanException e) {
-			return new Object[]{false,e.table(luan)};
+			return new Object[]{false,e.table(f.luan())};
 		}
 	}