# HG changeset patch # User Christian Brabandt # Date 1456587904 -3600 # Node ID ff900e499f79ed7ade315db6ae59d07a8699633b # Parent fbf8242df3a4df8364ca32f6419bdc3edf06445d commit https://github.com/vim/vim/commit/7ce686c990ea8c490d16be7f1c6bd95eb48816f9 Author: Bram Moolenaar Date: Sat Feb 27 16:33:22 2016 +0100 patch 7.4.1430 Problem: When encoding JSON, turning NaN and Infinity into null without giving an error is not useful. Solution: Pass NaN and Infinity on. If the receiver can't handle them it will generate the error. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.4. Last change: 2016 Feb 23 +*eval.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -4561,6 +4561,8 @@ json_encode({expr}) *json_encode()* Vim values are converted as follows: Number decimal number Float floating point number + Float nan "NaN" + Float inf "Infinity" String in double quotes (possibly null) Funcref not possible, error List as an array (possibly null); when @@ -4571,13 +4573,9 @@ json_encode({expr}) *json_encode()* v:true "true" v:none "null" v:null "null" - Note that using v:none is permitted, although the JSON - standard does not allow empty items. This can be useful for - omitting items in an array: - [0,,,,,5] ~ - This is much more efficient than: - [0,null,null,null,null,5] ~ - But a strict JSON parser will not accept it. + Note that NaN and Infinity are passed on as values. This is + missing in the JSON standard, but several implementations do + allow it. If not then you will get an error. keys({dict}) *keys()* Return a |List| with all the keys of {dict}. The |List| is in diff --git a/src/json.c b/src/json.c --- a/src/json.c +++ b/src/json.c @@ -27,8 +27,10 @@ # define isnan(x) _isnan(x) # define isinf(x) (!_finite(x) && !_isnan(x)) # endif -# if defined(_MSC_VER) && !defined(INFINITY) +# if !defined(INFINITY) && defined(DBL_MAX) # define INFINITY (DBL_MAX+DBL_MAX) +# endif +# if !defined(NAN) && defined(INFINITY) # define NAN (INFINITY-INFINITY) # endif #endif @@ -285,12 +287,10 @@ json_encode_item(garray_T *gap, typval_T case VAR_FLOAT: #ifdef FEAT_FLOAT # if defined(HAVE_MATH_H) - if ((options & JSON_JS) && isnan(val->vval.v_float)) + if (isnan(val->vval.v_float)) ga_concat(gap, (char_u *)"NaN"); - else if ((options & JSON_JS) && isinf(val->vval.v_float)) + else if (isinf(val->vval.v_float)) ga_concat(gap, (char_u *)"Infinity"); - else if (isnan(val->vval.v_float) || isinf(val->vval.v_float)) - ga_concat(gap, (char_u *)"null"); else # endif { diff --git a/src/testdir/test_json.vim b/src/testdir/test_json.vim --- a/src/testdir/test_json.vim +++ b/src/testdir/test_json.vim @@ -19,11 +19,9 @@ let s:varnr = 1234 if has('float') let s:jsonfl = '12.34' let s:varfl = 12.34 - let s:jsoninf = 'null' - let s:jsinf = 'Infinity' + let s:jsoninf = 'Infinity' let s:varinf = 1.0 / 0.0 - let s:jsonnan = 'null' - let s:jsnan = 'NaN' + let s:jsonnan = 'NaN' let s:varnan = 0.0 / 0.0 endif @@ -175,8 +173,8 @@ func Test_js_encode() call assert_equal(s:jsonnr, js_encode(s:varnr)) if has('float') call assert_equal(s:jsonfl, js_encode(s:varfl)) - call assert_equal(s:jsinf, js_encode(s:varinf)) - call assert_equal(s:jsnan, js_encode(s:varnan)) + call assert_equal(s:jsoninf, js_encode(s:varinf)) + call assert_equal(s:jsonnan, js_encode(s:varnan)) endif call assert_equal(s:jsonl1, js_encode(s:varl1)) @@ -213,8 +211,8 @@ func Test_js_decode() call assert_equal(s:varnr, js_decode(s:jsonnr)) if has('float') call assert_equal(s:varfl, js_decode(s:jsonfl)) - call assert_equal(s:varinf, js_decode(s:jsinf)) - call assert_true(isnan(js_decode(s:jsnan))) + call assert_equal(s:varinf, js_decode(s:jsoninf)) + call assert_true(isnan(js_decode(s:jsonnan))) endif call assert_equal(s:varl1, js_decode(s:jsonl1)) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -749,6 +749,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1430, +/**/ 1429, /**/ 1428,