diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-06-20 22:46:18 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-06-20 22:46:18 -0700 |
commit | 2619181c7f4139af56f2fce340d2b0046b12d552 (patch) | |
tree | c6b649f965be4a59ca356826f3985752f8e3ee54 | |
parent | f34284f052caacc7e0873d8ea333d372e8e10125 (diff) | |
download | txr-2619181c7f4139af56f2fce340d2b0046b12d552.tar.gz txr-2619181c7f4139af56f2fce340d2b0046b12d552.tar.bz2 txr-2619181c7f4139af56f2fce340d2b0046b12d552.zip |
ffi: fix broken float put.
* ffi.c (ffi_float_put): Fix silly range check:
FLT_MIN and FLT_MAX are, of course, both positive.
Also, fix num being used as an argument in the error
diagnostic. It's the address of a C function, not
an object.
-rw-r--r-- | ffi.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -27,6 +27,7 @@ #include <limits.h> #include <float.h> +#include <math.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> @@ -684,8 +685,11 @@ static void ffi_float_put(struct txr_ffi_type *tft, val n, mem_t *dst, val self) break; } - if (v > FLT_MAX || v < FLT_MIN) - uw_throwf(error_s, lit("~a: ~s is out of float range"), self, num, nao); + { + double pv = fabs(v); + if (pv > FLT_MAX || (pv != 0.0 && pv < FLT_MIN)) + uw_throwf(error_s, lit("~a: ~s is out of float range"), self, n, nao); + } align_sw_put(double, dst, *coerce(float *, dst) = v); } |