diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2016-02-28 11:48:54 -0500 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2016-02-28 11:48:54 -0500 |
commit | 0c2ba7554fe6b1b821ad662872ab6b13dd0487d3 (patch) | |
tree | 854f68f6a1648cf44c267b03dc6090c295728548 /src | |
parent | 8ade191b7ab6dec93b09259ac4a370ed5b29df3a (diff) | |
parent | 92d4dfdca5f83906f4a9fa7409c7c8f5e603e4d5 (diff) | |
download | rneovim-0c2ba7554fe6b1b821ad662872ab6b13dd0487d3.tar.gz rneovim-0c2ba7554fe6b1b821ad662872ab6b13dd0487d3.tar.bz2 rneovim-0c2ba7554fe6b1b821ad662872ab6b13dd0487d3.zip |
Merge pull request #3900 from ZyX-I/inf-nan-string
Make it possible to eval() all floating-point values dumped by string()
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 982c14cd08..76deedfad0 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -4010,12 +4010,22 @@ eval6 ( * When either side is a float the result is a float. */ if (use_float) { - if (op == '*') + if (op == '*') { f1 = f1 * f2; - else if (op == '/') { - /* We rely on the floating point library to handle divide - * by zero to result in "inf" and not a crash. */ - f1 = f2 != 0 ? f1 / f2 : INFINITY; + } else if (op == '/') { + // Division by zero triggers error from AddressSanitizer + f1 = (f2 == 0 + ? ( +#ifdef NAN + f1 == 0 + ? NAN + : +#endif + (f1 > 0 + ? INFINITY + : -INFINITY) + ) + : f1 / f2); } else { EMSG(_("E804: Cannot use '%' with Float")); return FAIL; @@ -6848,9 +6858,25 @@ vim_to_msgpack_error_ret: \ #define CONV_FLOAT(flt) \ do { \ - char numbuf[NUMBUFLEN]; \ - vim_snprintf(numbuf, NUMBUFLEN - 1, "%g", (flt)); \ - ga_concat(gap, (char_u *) numbuf); \ + const float_T flt_ = (flt); \ + switch (fpclassify(flt_)) { \ + case FP_NAN: { \ + ga_concat(gap, (char_u *) "str2float('nan')"); \ + break; \ + } \ + case FP_INFINITE: { \ + if (flt_ < 0) { \ + ga_append(gap, '-'); \ + } \ + ga_concat(gap, (char_u *) "str2float('inf')"); \ + break; \ + } \ + default: { \ + char numbuf[NUMBUFLEN]; \ + vim_snprintf(numbuf, NUMBUFLEN - 1, "%g", flt_); \ + ga_concat(gap, (char_u *) numbuf); \ + } \ + } \ } while (0) #define CONV_FUNC(fun) \ |