unix/modffi: Support passing float/double args.

pull/1201/merge
Damien George 2015-04-28 19:40:34 +01:00
rodzic f1ed8c8a2e
commit 6bbbb1ab41
3 zmienionych plików z 28 dodań i 0 usunięć

Wyświetl plik

@ -24,3 +24,11 @@ print('%.6f' % strtof('1.23', None))
strtod = libc.func("d", "strtod", "sp")
print('%.6f' % strtod('1.23', None))
# test passing double and float args
libm = ffi_open(('libm.so', 'libc.so.0', 'libc.so.6', 'libc.dylib'))
tgamma = libm.func('d', 'tgamma', 'd')
tgammaf = libm.func('f', 'tgammaf', 'f')
for fun in (tgamma, tgammaf):
for val in (0.5, 1, 1.0, 1.5, 4, 4.0):
print('%.6f' % fun(val))

Wyświetl plik

@ -1,2 +1,14 @@
1.230000
1.230000
1.772454
1.000000
1.000000
0.886227
6.000000
6.000000
1.772454
1.000000
1.000000
0.886227
6.000000
6.000000

Wyświetl plik

@ -356,6 +356,14 @@ STATIC mp_obj_t ffifunc_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw,
mp_obj_t a = args[i];
if (*argtype == 'O') {
values[i] = (ffi_arg)a;
#if MICROPY_PY_BUILTINS_FLOAT
} else if (*argtype == 'f') {
float *p = (float*)&values[i];
*p = mp_obj_get_float(a);
} else if (*argtype == 'd') {
double *p = (double*)&values[i];
*p = mp_obj_get_float(a);
#endif
} else if (a == mp_const_none) {
values[i] = 0;
} else if (MP_OBJ_IS_INT(a)) {