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