1616#include "vim.h"
1717
1818#if defined(FEAT_EVAL ) || defined(PROTO )
19- static int json_encode_item (garray_T * gap , typval_T * val , int copyID );
19+ static int json_encode_item (garray_T * gap , typval_T * val , int copyID , int allow_none );
2020static int json_decode_item (js_read_T * reader , typval_T * res );
2121
2222/*
@@ -29,7 +29,7 @@ json_encode(typval_T *val)
2929
3030 /* Store bytes in the growarray. */
3131 ga_init2 (& ga , 1 , 4000 );
32- json_encode_item (& ga , val , get_copyID ());
32+ json_encode_item (& ga , val , get_copyID (), TRUE );
3333 return ga .ga_data ;
3434}
3535
@@ -121,7 +121,7 @@ write_string(garray_T *gap, char_u *str)
121121 * Return FAIL or OK.
122122 */
123123 static int
124- json_encode_item (garray_T * gap , typval_T * val , int copyID )
124+ json_encode_item (garray_T * gap , typval_T * val , int copyID , int allow_none )
125125{
126126 char_u numbuf [NUMBUFLEN ];
127127 char_u * res ;
@@ -135,7 +135,10 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID)
135135 {
136136 case VVAL_FALSE : ga_concat (gap , (char_u * )"false" ); break ;
137137 case VVAL_TRUE : ga_concat (gap , (char_u * )"true" ); break ;
138- case VVAL_NONE : break ;
138+ case VVAL_NONE : if (!allow_none )
139+ /* TODO: better error */
140+ EMSG (_ (e_invarg ));
141+ break ;
139142 case VVAL_NULL : ga_concat (gap , (char_u * )"null" ); break ;
140143 }
141144 break ;
@@ -152,7 +155,7 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID)
152155 break ;
153156
154157 case VAR_FUNC :
155- /* no JSON equivalent */
158+ /* no JSON equivalent TODO: better error */
156159 EMSG (_ (e_invarg ));
157160 return FAIL ;
158161
@@ -172,7 +175,8 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID)
172175 ga_append (gap , '[' );
173176 for (li = l -> lv_first ; li != NULL && !got_int ; )
174177 {
175- if (json_encode_item (gap , & li -> li_tv , copyID ) == FAIL )
178+ if (json_encode_item (gap , & li -> li_tv , copyID , TRUE)
179+ == FAIL )
176180 return FAIL ;
177181 li = li -> li_next ;
178182 if (li != NULL )
@@ -213,7 +217,7 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID)
213217 write_string (gap , hi -> hi_key );
214218 ga_append (gap , ':' );
215219 if (json_encode_item (gap , & dict_lookup (hi )-> di_tv ,
216- copyID ) == FAIL )
220+ copyID , FALSE ) == FAIL )
217221 return FAIL ;
218222 }
219223 ga_append (gap , '}' );
0 commit comments