Mercurial Hosting > luan
comparison src/luan/LuaJavaFunction.java @ 46:a443637829c1
remove LuaNumber
git-svn-id: https://luan-java.googlecode.com/svn/trunk@47 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Thu, 27 Dec 2012 01:48:36 +0000 |
parents | 57054fa43189 |
children | 659c7139e903 |
comparison
equal
deleted
inserted
replaced
45:b1b14d09fc98 | 46:a443637829c1 |
---|---|
123 } | 123 } |
124 }; | 124 }; |
125 | 125 |
126 private static final Object[] NULL_RTN = new Object[1]; | 126 private static final Object[] NULL_RTN = new Object[1]; |
127 | 127 |
128 private static final RtnConverter RTN_NUMBER = new RtnConverter() { | |
129 public Object[] convert(Object obj) { | |
130 if( obj == null ) | |
131 return NULL_RTN; | |
132 Number n = (Number)obj; | |
133 LuaNumber ln = LuaNumber.of(n); | |
134 return new Object[]{ln}; | |
135 } | |
136 }; | |
137 | |
138 private static final RtnConverter RTN_NUMBER_ARRAY = new RtnConverter() { | |
139 public Object[] convert(Object obj) { | |
140 if( obj == null ) | |
141 return NULL_RTN; | |
142 Object[] rtn = new Object[Array.getLength(obj)]; | |
143 for( int i=0; i<rtn.length; i++ ) { | |
144 Number n = (Number)Array.get(obj,i); | |
145 if( n != null ) | |
146 rtn[i] = LuaNumber.of(n.doubleValue()); | |
147 } | |
148 return rtn; | |
149 } | |
150 }; | |
151 | |
152 private static RtnConverter getRtnConverter(JavaMethod m) { | 128 private static RtnConverter getRtnConverter(JavaMethod m) { |
153 Class<?> rtnType = m.getReturnType(); | 129 Class<?> rtnType = m.getReturnType(); |
154 if( rtnType == Void.TYPE ) | 130 if( rtnType == Void.TYPE ) |
155 return RTN_EMPTY; | 131 return RTN_EMPTY; |
156 if( isNumber(rtnType) ) | |
157 return RTN_NUMBER; | |
158 if( rtnType.isArray() ) { | 132 if( rtnType.isArray() ) { |
159 rtnType = rtnType.getComponentType(); | |
160 if( isNumber(rtnType) ) | |
161 return RTN_NUMBER_ARRAY; | |
162 return RTN_ARRAY; | 133 return RTN_ARRAY; |
163 } | 134 } |
164 return RTN_ONE; | 135 return RTN_ONE; |
165 } | |
166 | |
167 private static boolean isNumber(Class<?> rtnType) { | |
168 return Number.class.isAssignableFrom(rtnType) | |
169 || rtnType == Byte.TYPE | |
170 || rtnType == Short.TYPE | |
171 || rtnType == Integer.TYPE | |
172 || rtnType == Long.TYPE | |
173 || rtnType == Float.TYPE | |
174 || rtnType == Double.TYPE | |
175 ; | |
176 } | 136 } |
177 | 137 |
178 | 138 |
179 private interface ArgConverter { | 139 private interface ArgConverter { |
180 public Object convert(Object obj); | 140 public Object convert(Object obj); |
181 } | 141 } |
182 | 142 |
183 private static final ArgConverter ARG_SAME = new ArgConverter() { | 143 private static final ArgConverter ARG_SAME = new ArgConverter() { |
184 public Object convert(Object obj) { | 144 public Object convert(Object obj) { |
185 return obj; | |
186 } | |
187 }; | |
188 | |
189 private static final ArgConverter ARG_DOUBLE = new ArgConverter() { | |
190 public Object convert(Object obj) { | |
191 if( obj instanceof LuaNumber ) { | |
192 LuaNumber ln = (LuaNumber)obj; | |
193 return Double.valueOf(ln.n); | |
194 } | |
195 if( obj instanceof String ) { | |
196 String s = (String)obj; | |
197 try { | |
198 return Double.valueOf(s); | |
199 } catch(NumberFormatException e) {} | |
200 } | |
201 return obj; | |
202 } | |
203 }; | |
204 | |
205 private static final ArgConverter ARG_FLOAT = new ArgConverter() { | |
206 public Object convert(Object obj) { | |
207 if( obj instanceof LuaNumber ) { | |
208 LuaNumber ln = (LuaNumber)obj; | |
209 return Float.valueOf((float)ln.n); | |
210 } | |
211 if( obj instanceof String ) { | |
212 String s = (String)obj; | |
213 try { | |
214 return Float.valueOf(s); | |
215 } catch(NumberFormatException e) {} | |
216 } | |
217 return obj; | |
218 } | |
219 }; | |
220 | |
221 private static final ArgConverter ARG_LONG = new ArgConverter() { | |
222 public Object convert(Object obj) { | |
223 if( obj instanceof LuaNumber ) { | |
224 LuaNumber ln = (LuaNumber)obj; | |
225 long i = (long)ln.n; | |
226 if( i == ln.n ) | |
227 return Long.valueOf(i); | |
228 } | |
229 else if( obj instanceof String ) { | |
230 String s = (String)obj; | |
231 try { | |
232 return Long.valueOf(s); | |
233 } catch(NumberFormatException e) {} | |
234 } | |
235 return obj; | |
236 } | |
237 }; | |
238 | |
239 private static final ArgConverter ARG_INTEGER = new ArgConverter() { | |
240 public Object convert(Object obj) { | |
241 if( obj instanceof LuaNumber ) { | |
242 LuaNumber ln = (LuaNumber)obj; | |
243 int i = (int)ln.n; | |
244 if( i == ln.n ) | |
245 return Integer.valueOf(i); | |
246 } | |
247 else if( obj instanceof String ) { | |
248 String s = (String)obj; | |
249 try { | |
250 return Integer.valueOf(s); | |
251 } catch(NumberFormatException e) {} | |
252 } | |
253 return obj; | |
254 } | |
255 }; | |
256 | |
257 private static final ArgConverter ARG_SHORT = new ArgConverter() { | |
258 public Object convert(Object obj) { | |
259 if( obj instanceof LuaNumber ) { | |
260 LuaNumber ln = (LuaNumber)obj; | |
261 short i = (short)ln.n; | |
262 if( i == ln.n ) | |
263 return Short.valueOf(i); | |
264 } | |
265 else if( obj instanceof String ) { | |
266 String s = (String)obj; | |
267 try { | |
268 return Short.valueOf(s); | |
269 } catch(NumberFormatException e) {} | |
270 } | |
271 return obj; | |
272 } | |
273 }; | |
274 | |
275 private static final ArgConverter ARG_BYTE = new ArgConverter() { | |
276 public Object convert(Object obj) { | |
277 if( obj instanceof LuaNumber ) { | |
278 LuaNumber ln = (LuaNumber)obj; | |
279 byte i = (byte)ln.n; | |
280 if( i == ln.n ) | |
281 return Byte.valueOf(i); | |
282 } | |
283 else if( obj instanceof String ) { | |
284 String s = (String)obj; | |
285 try { | |
286 return Byte.valueOf(s); | |
287 } catch(NumberFormatException e) {} | |
288 } | |
289 return obj; | 145 return obj; |
290 } | 146 } |
291 }; | 147 }; |
292 | 148 |
293 private static boolean takesLuaState(JavaMethod m) { | 149 private static boolean takesLuaState(JavaMethod m) { |
312 } | 168 } |
313 return a; | 169 return a; |
314 } | 170 } |
315 | 171 |
316 private static ArgConverter getArgConverter(Class<?> cls) { | 172 private static ArgConverter getArgConverter(Class<?> cls) { |
317 if( cls == Double.TYPE || cls.equals(Double.class) ) | |
318 return ARG_DOUBLE; | |
319 if( cls == Float.TYPE || cls.equals(Float.class) ) | |
320 return ARG_FLOAT; | |
321 if( cls == Long.TYPE || cls.equals(Long.class) ) | |
322 return ARG_LONG; | |
323 if( cls == Integer.TYPE || cls.equals(Integer.class) ) | |
324 return ARG_INTEGER; | |
325 if( cls == Short.TYPE || cls.equals(Short.class) ) | |
326 return ARG_SHORT; | |
327 if( cls == Byte.TYPE || cls.equals(Byte.class) ) | |
328 return ARG_BYTE; | |
329 return ARG_SAME; | 173 return ARG_SAME; |
330 } | 174 } |
331 | 175 |
332 | 176 |
333 | 177 |