aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2016-02-28 11:48:54 -0500
committerJustin M. Keyes <justinkz@gmail.com>2016-02-28 11:48:54 -0500
commit0c2ba7554fe6b1b821ad662872ab6b13dd0487d3 (patch)
tree854f68f6a1648cf44c267b03dc6090c295728548 /src
parent8ade191b7ab6dec93b09259ac4a370ed5b29df3a (diff)
parent92d4dfdca5f83906f4a9fa7409c7c8f5e603e4d5 (diff)
downloadrneovim-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.c42
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) \