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:
parent
d804fdf4c2
commit
7ce686c990
@ -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
|
||||||
|
10
src/json.c
10
src/json.c
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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))
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user