0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

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.
This commit is contained in:
Bram Moolenaar 2016-02-27 16:33:22 +01:00
parent d804fdf4c2
commit 7ce686c990
4 changed files with 19 additions and 21 deletions

View File

@ -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 VIM REFERENCE MANUAL by Bram Moolenaar
@ -4561,6 +4561,8 @@ json_encode({expr}) *json_encode()*
Vim values are converted as follows: Vim values are converted as follows:
Number decimal number Number decimal number
Float floating point number Float floating point number
Float nan "NaN"
Float inf "Infinity"
String in double quotes (possibly null) String in double quotes (possibly null)
Funcref not possible, error Funcref not possible, error
List as an array (possibly null); when List as an array (possibly null); when
@ -4571,13 +4573,9 @@ json_encode({expr}) *json_encode()*
v:true "true" v:true "true"
v:none "null" v:none "null"
v:null "null" v:null "null"
Note that using v:none is permitted, although the JSON Note that NaN and Infinity are passed on as values. This is
standard does not allow empty items. This can be useful for missing in the JSON standard, but several implementations do
omitting items in an array: allow it. If not then you will get an error.
[0,,,,,5] ~
This is much more efficient than:
[0,null,null,null,null,5] ~
But a strict JSON parser will not accept it.
keys({dict}) *keys()* keys({dict}) *keys()*
Return a |List| with all the keys of {dict}. The |List| is in Return a |List| with all the keys of {dict}. The |List| is in

View File

@ -27,8 +27,10 @@
# define isnan(x) _isnan(x) # define isnan(x) _isnan(x)
# define isinf(x) (!_finite(x) && !_isnan(x)) # define isinf(x) (!_finite(x) && !_isnan(x))
# endif # endif
# if defined(_MSC_VER) && !defined(INFINITY) # if !defined(INFINITY) && defined(DBL_MAX)
# define INFINITY (DBL_MAX+DBL_MAX) # define INFINITY (DBL_MAX+DBL_MAX)
# endif
# if !defined(NAN) && defined(INFINITY)
# define NAN (INFINITY-INFINITY) # define NAN (INFINITY-INFINITY)
# endif # endif
#endif #endif
@ -285,12 +287,10 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID, int options)
case VAR_FLOAT: case VAR_FLOAT:
#ifdef FEAT_FLOAT #ifdef FEAT_FLOAT
# if defined(HAVE_MATH_H) # 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"); 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"); 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 else
# endif # endif
{ {

View File

@ -19,11 +19,9 @@ let s:varnr = 1234
if has('float') if has('float')
let s:jsonfl = '12.34' let s:jsonfl = '12.34'
let s:varfl = 12.34 let s:varfl = 12.34
let s:jsoninf = 'null' let s:jsoninf = 'Infinity'
let s:jsinf = 'Infinity'
let s:varinf = 1.0 / 0.0 let s:varinf = 1.0 / 0.0
let s:jsonnan = 'null' let s:jsonnan = 'NaN'
let s:jsnan = 'NaN'
let s:varnan = 0.0 / 0.0 let s:varnan = 0.0 / 0.0
endif endif
@ -175,8 +173,8 @@ func Test_js_encode()
call assert_equal(s:jsonnr, js_encode(s:varnr)) call assert_equal(s:jsonnr, js_encode(s:varnr))
if has('float') if has('float')
call assert_equal(s:jsonfl, js_encode(s:varfl)) call assert_equal(s:jsonfl, js_encode(s:varfl))
call assert_equal(s:jsinf, js_encode(s:varinf)) call assert_equal(s:jsoninf, js_encode(s:varinf))
call assert_equal(s:jsnan, js_encode(s:varnan)) call assert_equal(s:jsonnan, js_encode(s:varnan))
endif endif
call assert_equal(s:jsonl1, js_encode(s:varl1)) 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)) call assert_equal(s:varnr, js_decode(s:jsonnr))
if has('float') if has('float')
call assert_equal(s:varfl, js_decode(s:jsonfl)) call assert_equal(s:varfl, js_decode(s:jsonfl))
call assert_equal(s:varinf, js_decode(s:jsinf)) call assert_equal(s:varinf, js_decode(s:jsoninf))
call assert_true(isnan(js_decode(s:jsnan))) call assert_true(isnan(js_decode(s:jsonnan)))
endif endif
call assert_equal(s:varl1, js_decode(s:jsonl1)) call assert_equal(s:varl1, js_decode(s:jsonl1))

View File

@ -748,6 +748,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1430,
/**/ /**/
1429, 1429,
/**/ /**/