diff --git a/tests/run-tests b/tests/run-tests index 8e7d2f257551e01dcf2847242042d4c287dfba66..15eedc43c4ff887d2226f3cac7f38ec1a036809d 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -149,7 +149,7 @@ def main(): if args.test_dirs is None: if pyb is None: # run PC tests - test_dirs = ('basics', 'micropython', 'float', 'import', 'io', 'misc', 'unicode') + test_dirs = ('basics', 'micropython', 'float', 'import', 'io', 'misc', 'unicode', 'unix') else: # run pyboard tests test_dirs = ('basics', 'micropython', 'float', 'pyb', 'pybnative', 'inlineasm') diff --git a/tests/unix/ffi_float.py b/tests/unix/ffi_float.py new file mode 100644 index 0000000000000000000000000000000000000000..96a5ceeca6e8f718378ee9ef76694161fe1e4805 --- /dev/null +++ b/tests/unix/ffi_float.py @@ -0,0 +1,21 @@ +# test ffi float support + +import ffi + +def ffi_open(names): + err = None + for n in names: + try: + mod = ffi.open(n) + return mod + except OSError as e: + err = e + raise err + +libc = ffi_open(('libc.so', 'libc.so.0', 'libc.so.6')) + +strtof = libc.func("f", "strtof", "sp") +print('%.6f' % strtof('1.23', None)) + +strtod = libc.func("d", "strtod", "sp") +print('%.6f' % strtod('1.23', None)) diff --git a/tests/unix/ffi_float.py.exp b/tests/unix/ffi_float.py.exp new file mode 100644 index 0000000000000000000000000000000000000000..e6fd5b729224639a3068af424bf2391d147b4a31 --- /dev/null +++ b/tests/unix/ffi_float.py.exp @@ -0,0 +1,2 @@ +1.230000 +1.230000 diff --git a/unix/Makefile b/unix/Makefile index 9d035cab76ec899b5437def7d9ffd8188401dbdd..fff6fe0944d621cacd1939e0cd2daf350e28607c 100644 --- a/unix/Makefile +++ b/unix/Makefile @@ -18,7 +18,7 @@ INC += -I$(PY_SRC) INC += -I$(BUILD) # compiler settings -CWARN = -Wall -Werror -Wno-error=cpp +CWARN = -Wall -Werror CFLAGS = $(INC) $(CWARN) -ansi -std=gnu99 -DUNIX $(CFLAGS_MOD) $(COPT) $(CFLAGS_EXTRA) # Debugging/Optimization diff --git a/unix/modffi.c b/unix/modffi.c index c788f5dd268e76934b485e476ff8b53e731f18c0..e019e9fc9588a15cc663d11cc315cf4676aa4d4d 100644 --- a/unix/modffi.c +++ b/unix/modffi.c @@ -146,8 +146,8 @@ STATIC mp_obj_t return_ffi_value(ffi_arg val, char type) case 'v': return mp_const_none; case 'f': { - float *p = (float*)&val; - return mp_obj_new_float(*p); + union { ffi_arg ffi; float flt; } val_union = { .ffi = val }; + return mp_obj_new_float(val_union.flt); } case 'd': { double *p = (double*)&val; diff --git a/unix/modsocket.c b/unix/modsocket.c index be97441af26cae2bb2ff0b51c7bf918de4730d65..76787184a04a4e9da02c630789a56e8f071a9238 100644 --- a/unix/modsocket.c +++ b/unix/modsocket.c @@ -371,7 +371,8 @@ STATIC mp_obj_t mod_socket_getaddrinfo(mp_uint_t n_args, const mp_obj_t *args) { hints.ai_flags = AI_NUMERICSERV; #ifdef __UCLIBC_MAJOR__ #if __UCLIBC_MAJOR__ == 0 && (__UCLIBC_MINOR__ < 9 || (__UCLIBC_MINOR__ == 9 && __UCLIBC_SUBLEVEL__ <= 32)) -#warning Working around uClibc bug with numeric service name +// "warning" requires -Wno-cpp which is a relatively new gcc option, so we choose not to use it. +//#warning Working around uClibc bug with numeric service name // Older versions og uClibc have bugs when numeric ports in service // arg require also hints.ai_socktype (or hints.ai_protocol) != 0 // This actually was fixed in 0.9.32.1, but uClibc doesn't allow to