Mercurial Hosting > luan
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) { |