comparison core/src/luan/modules/BasicLuan.java @ 432:d9df6d6cb927

finish fixing LuanTable to use metatables
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 02 May 2015 23:41:59 -0600
parents dae264ad6a7b
children 75ccb4da803f
comparison
equal deleted inserted replaced
431:3ffe8ba5b297 432:d9df6d6cb927
46 public static Object do_file(LuanState luan,String fileName) throws LuanException { 46 public static Object do_file(LuanState luan,String fileName) throws LuanException {
47 LuanFunction fn = load_file(luan,fileName,null); 47 LuanFunction fn = load_file(luan,fileName,null);
48 return luan.call(fn); 48 return luan.call(fn);
49 } 49 }
50 50
51 public static LuanFunction pairs(LuanState luan,final LuanTable t) throws LuanException { 51 public static LuanFunction pairs(final LuanState luan,final LuanTable t) throws LuanException {
52 Utils.checkNotNull(luan,t); 52 Utils.checkNotNull(luan,t);
53 Object obj = t.getHandler("__pairs"); 53 return t.pairs(luan);
54 if( obj != null ) {
55 if( obj instanceof LuanFunction ) {
56 obj = Luan.first(luan.call((LuanFunction)obj,"__pairs",new Object[]{t}));
57 if( !(obj instanceof LuanFunction) )
58 throw luan.exception( "metamethod __pairs should return function but returned " + Luan.type(obj) );
59 return (LuanFunction)obj;
60 }
61 if( obj instanceof LuanMeta ) {
62 LuanMeta meta = (LuanMeta)obj;
63 return meta.__pairs(luan,t);
64 }
65 throw luan.exception( "invalid type of metamethod __pairs: " + Luan.type(obj) );
66 }
67 return new LuanFunction() {
68 final Iterator<Map.Entry<Object,Object>> iter = t.iterator();
69
70 @Override public Object[] call(LuanState luan,Object[] args) {
71 if( !iter.hasNext() )
72 return LuanFunction.NOTHING;
73 Map.Entry<Object,Object> entry = iter.next();
74 return new Object[]{entry.getKey(),entry.getValue()};
75 }
76 };
77 } 54 }
78 55
79 public static LuanFunction ipairs(LuanState luan,final LuanTable t) throws LuanException { 56 public static LuanFunction ipairs(LuanState luan,final LuanTable t) throws LuanException {
80 Utils.checkNotNull(luan,t); 57 Utils.checkNotNull(luan,t);
81 return new LuanFunction() { 58 return new LuanFunction() {
119 String s = (String)v; 96 String s = (String)v;
120 return s.length(); 97 return s.length();
121 } 98 }
122 if( v instanceof LuanTable ) { 99 if( v instanceof LuanTable ) {
123 LuanTable t = (LuanTable)v; 100 LuanTable t = (LuanTable)v;
124 return t.length(); 101 return t.rawLength();
125 } 102 }
126 throw luan.exception( "bad argument #1 to 'raw_len' (table or string expected)" ); 103 throw luan.exception( "bad argument #1 to 'raw_len' (table or string expected)" );
127 } 104 }
128 105
129 public static Number to_number(Object e,Integer base) { 106 public static Number to_number(Object e,Integer base) {