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