comparison core/src/luan/modules/BasicLuan.java @ 646:cdc70de628b5

simplify LuanException
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 29 Mar 2016 19:58:39 -0600
parents 859c0dedc8b6
children d95caff8ba8c
comparison
equal deleted inserted replaced
645:859c0dedc8b6 646:cdc70de628b5
44 public static LuanFunction load_file(LuanState luan,String fileName,Boolean addExtension) throws LuanException { 44 public static LuanFunction load_file(LuanState luan,String fileName,Boolean addExtension) throws LuanException {
45 if( fileName == null ) 45 if( fileName == null )
46 fileName = "stdin:"; 46 fileName = "stdin:";
47 String src = PackageLuan.read(luan,fileName,addExtension); 47 String src = PackageLuan.read(luan,fileName,addExtension);
48 if( src == null ) 48 if( src == null )
49 throw new LuanException(luan, "file '"+fileName+"' not found" ); 49 throw new LuanException("file '"+fileName+"' not found" );
50 return load(luan,src,fileName,null,false); 50 return load(luan,src,fileName,null,false);
51 } 51 }
52 52
53 public static LuanFunction pairs(final LuanState luan,final LuanTable t) throws LuanException { 53 public static LuanFunction pairs(final LuanState luan,final LuanTable t) throws LuanException {
54 Utils.checkNotNull(luan,t); 54 Utils.checkNotNull(t);
55 return t.pairs(luan); 55 return t.pairs(luan);
56 } 56 }
57 57
58 public static LuanFunction ipairs(LuanState luan,final LuanTable t) throws LuanException { 58 public static LuanFunction ipairs(final LuanTable t) throws LuanException {
59 Utils.checkNotNull(luan,t); 59 Utils.checkNotNull(t);
60 return new LuanFunction() { 60 return new LuanFunction() {
61 List<Object> list = t.asList(); 61 List<Object> list = t.asList();
62 int i = 0; 62 int i = 0;
63 final int size = list.size(); 63 final int size = list.size();
64 64
69 return new Object[]{i,val}; 69 return new Object[]{i,val};
70 } 70 }
71 }; 71 };
72 } 72 }
73 73
74 public static Object get_metatable(LuanState luan,LuanTable table) throws LuanException { 74 public static Object get_metatable(LuanTable table) throws LuanException {
75 Utils.checkNotNull(luan,table); 75 Utils.checkNotNull(table);
76 LuanTable metatable = table.getMetatable(); 76 LuanTable metatable = table.getMetatable();
77 if( metatable == null ) 77 if( metatable == null )
78 return null; 78 return null;
79 Object obj = metatable.rawGet("__metatable"); 79 Object obj = metatable.rawGet("__metatable");
80 return obj!=null ? obj : metatable; 80 return obj!=null ? obj : metatable;
81 } 81 }
82 82
83 public static void set_metatable(LuanState luan,LuanTable table,LuanTable metatable) throws LuanException { 83 public static void set_metatable(LuanTable table,LuanTable metatable) throws LuanException {
84 Utils.checkNotNull(luan,table); 84 Utils.checkNotNull(table);
85 if( table.getHandler("__metatable") != null ) 85 if( table.getHandler("__metatable") != null )
86 throw new LuanException(luan,"cannot change a protected metatable"); 86 throw new LuanException("cannot change a protected metatable");
87 table.setMetatable(metatable); 87 table.setMetatable(metatable);
88 } 88 }
89 89
90 public static boolean raw_equal(Object v1,Object v2) { 90 public static boolean raw_equal(Object v1,Object v2) {
91 return v1 == v2 || v1 != null && v1.equals(v2); 91 return v1 == v2 || v1 != null && v1.equals(v2);
97 97
98 public static void raw_set(LuanTable table,Object index,Object value) { 98 public static void raw_set(LuanTable table,Object index,Object value) {
99 table.rawPut(index,value); 99 table.rawPut(index,value);
100 } 100 }
101 101
102 public static int raw_len(LuanState luan,Object v) throws LuanException { 102 public static int raw_len(Object v) throws LuanException {
103 if( v instanceof String ) { 103 if( v instanceof String ) {
104 String s = (String)v; 104 String s = (String)v;
105 return s.length(); 105 return s.length();
106 } 106 }
107 if( v instanceof LuanTable ) { 107 if( v instanceof LuanTable ) {
108 LuanTable t = (LuanTable)v; 108 LuanTable t = (LuanTable)v;
109 return t.rawLength(); 109 return t.rawLength();
110 } 110 }
111 throw new LuanException(luan, "bad argument #1 to 'raw_len' (table or string expected)" ); 111 throw new LuanException( "bad argument #1 to 'raw_len' (table or string expected)" );
112 } 112 }
113 113
114 public static String to_string(LuanState luan,Object v) throws LuanException { 114 public static String to_string(LuanState luan,Object v) throws LuanException {
115 return luan.toString(v); 115 return luan.toString(v);
116 } 116 }
117 117
118 public static LuanTable new_error(LuanState luan,Object msg) throws LuanException { 118 public static LuanTable new_error(LuanState luan,Object msg) throws LuanException {
119 return new LuanException(luan,msg).table(); 119 String s = luan.toString(msg);
120 } 120 LuanTable tbl = new LuanException(s).table();
121 121 tbl.rawPut( "message", msg );
122 public static String assert_string(LuanState luan,String v) throws LuanException { 122 return tbl;
123 Utils.checkNotNull(luan,v); 123 }
124 return v; 124
125 } 125 public static String assert_string(String v) throws LuanException {
126 126 Utils.checkNotNull(v);
127 public static Number assert_number(LuanState luan,Number v) throws LuanException { 127 return v;
128 Utils.checkNotNull(luan,v); 128 }
129 return v; 129
130 } 130 public static Number assert_number(Number v) throws LuanException {
131 131 Utils.checkNotNull(v);
132 public static LuanTable assert_table(LuanState luan,LuanTable v) throws LuanException { 132 return v;
133 Utils.checkNotNull(luan,v); 133 }
134 return v; 134
135 } 135 public static LuanTable assert_table(LuanTable v) throws LuanException {
136 136 Utils.checkNotNull(v);
137 public static boolean assert_boolean(LuanState luan,boolean v) throws LuanException { 137 return v;
138 return v; 138 }
139 } 139
140 140 public static boolean assert_boolean(boolean v) throws LuanException {
141 public static int assert_integer(LuanState luan,int v) throws LuanException { 141 return v;
142 return v; 142 }
143 } 143
144 144 public static int assert_integer(int v) throws LuanException {
145 public static long assert_long(LuanState luan,long v) throws LuanException { 145 return v;
146 return v; 146 }
147 } 147
148 148 public static long assert_long(long v) throws LuanException {
149 public static double assert_double(LuanState luan,double v) throws LuanException { 149 return v;
150 return v; 150 }
151 } 151
152 152 public static double assert_double(double v) throws LuanException {
153 @LuanMethod public static byte[] assert_binary(LuanState luan,byte[] v) throws LuanException { 153 return v;
154 Utils.checkNotNull(luan,v); 154 }
155 return v; 155
156 } 156 @LuanMethod public static byte[] assert_binary(byte[] v) throws LuanException {
157 157 Utils.checkNotNull(v);
158 public static LuanFunction assert_function(LuanState luan,LuanFunction v) throws LuanException { 158 return v;
159 Utils.checkNotNull(luan,v); 159 }
160 return v; 160
161 } 161 public static LuanFunction assert_function(LuanFunction v) throws LuanException {
162 162 Utils.checkNotNull(v);
163 public static LuanFunction range(LuanState luan,final double from,final double to,Double stepV) throws LuanException { 163 return v;
164 }
165
166 public static LuanFunction range(final double from,final double to,Double stepV) throws LuanException {
164 final double step = stepV==null ? 1.0 : stepV; 167 final double step = stepV==null ? 1.0 : stepV;
165 if( step == 0.0 ) 168 if( step == 0.0 )
166 throw new LuanException(luan,"bad argument #3 (step may not be zero)"); 169 throw new LuanException("bad argument #3 (step may not be zero)");
167 return new LuanFunction() { 170 return new LuanFunction() {
168 double v = from; 171 double v = from;
169 172
170 @Override public Object call(LuanState luan,Object[] args) { 173 @Override public Object call(LuanState luan,Object[] args) {
171 if( step > 0.0 && v > to || step < 0.0 && v < to ) 174 if( step > 0.0 && v > to || step < 0.0 && v < to )
192 private LuanFunction fn(Object obj) { 195 private LuanFunction fn(Object obj) {
193 return obj instanceof LuanFunction ? (LuanFunction)obj : null; 196 return obj instanceof LuanFunction ? (LuanFunction)obj : null;
194 } 197 }
195 198
196 public static Object try_(LuanState luan,LuanTable blocks,Object... args) throws LuanException { 199 public static Object try_(LuanState luan,LuanTable blocks,Object... args) throws LuanException {
197 Utils.checkNotNull(luan,blocks); 200 Utils.checkNotNull(blocks);
198 Object obj = blocks.get(luan,1); 201 Object obj = blocks.get(luan,1);
199 if( obj == null ) 202 if( obj == null )
200 throw new LuanException(luan,"missing 'try' value"); 203 throw new LuanException("missing 'try' value");
201 if( !(obj instanceof LuanFunction) ) 204 if( !(obj instanceof LuanFunction) )
202 throw new LuanException(luan,"bad 'try' value (function expected, got "+Luan.type(obj)+")"); 205 throw new LuanException("bad 'try' value (function expected, got "+Luan.type(obj)+")");
203 LuanFunction tryFn = (LuanFunction)obj; 206 LuanFunction tryFn = (LuanFunction)obj;
204 LuanFunction catchFn = null; 207 LuanFunction catchFn = null;
205 obj = blocks.get(luan,"catch"); 208 obj = blocks.get(luan,"catch");
206 if( obj != null ) { 209 if( obj != null ) {
207 if( !(obj instanceof LuanFunction) ) 210 if( !(obj instanceof LuanFunction) )
208 throw new LuanException(luan,"bad 'catch' value (function expected, got "+Luan.type(obj)+")"); 211 throw new LuanException("bad 'catch' value (function expected, got "+Luan.type(obj)+")");
209 catchFn = (LuanFunction)obj; 212 catchFn = (LuanFunction)obj;
210 } 213 }
211 LuanFunction finallyFn = null; 214 LuanFunction finallyFn = null;
212 obj = blocks.get(luan,"finally"); 215 obj = blocks.get(luan,"finally");
213 if( obj != null ) { 216 if( obj != null ) {
214 if( !(obj instanceof LuanFunction) ) 217 if( !(obj instanceof LuanFunction) )
215 throw new LuanException(luan,"bad 'finally' value (function expected, got "+Luan.type(obj)+")"); 218 throw new LuanException("bad 'finally' value (function expected, got "+Luan.type(obj)+")");
216 finallyFn = (LuanFunction)obj; 219 finallyFn = (LuanFunction)obj;
217 } 220 }
218 try { 221 try {
219 return tryFn.call(luan,args); 222 return tryFn.call(luan,args);
220 } catch(LuanException e) { 223 } catch(LuanException e) {
239 } catch(LuanException e) { 242 } catch(LuanException e) {
240 return new Object[]{false,e.table()}; 243 return new Object[]{false,e.table()};
241 } 244 }
242 } 245 }
243 246
244 public static String number_type(LuanState luan,Number v) throws LuanException { 247 public static String number_type(Number v) throws LuanException {
245 Utils.checkNotNull(luan,v); 248 Utils.checkNotNull(v);
246 return v.getClass().getSimpleName().toLowerCase(); 249 return v.getClass().getSimpleName().toLowerCase();
247 } 250 }
248 251
249 } 252 }