changeset 7947:b2922673917a v7.4.1269

commit https://github.com/vim/vim/commit/4f8b8faec31a934920a723053e8dcf47b6fac08c Author: Bram Moolenaar <Bram@vim.org> Date: Sat Feb 6 18:42:07 2016 +0100 patch 7.4.1269 Problem: Encoding {'key':} to JSON doesn't give an error (Tyru) Solution: Give an error.
author Christian Brabandt <cb@256bit.org>
date Sat, 06 Feb 2016 18:45:04 +0100
parents b91049e93f0b
children 78a6b6180d8c
files src/json.c src/testdir/test_json.vim src/version.c
diffstat 3 files changed, 14 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/json.c
+++ b/src/json.c
@@ -16,7 +16,7 @@
 #include "vim.h"
 
 #if defined(FEAT_EVAL) || defined(PROTO)
-static int json_encode_item(garray_T *gap, typval_T *val, int copyID);
+static int json_encode_item(garray_T *gap, typval_T *val, int copyID, int allow_none);
 static int json_decode_item(js_read_T *reader, typval_T *res);
 
 /*
@@ -29,7 +29,7 @@ json_encode(typval_T *val)
 
     /* Store bytes in the growarray. */
     ga_init2(&ga, 1, 4000);
-    json_encode_item(&ga, val, get_copyID());
+    json_encode_item(&ga, val, get_copyID(), TRUE);
     return ga.ga_data;
 }
 
@@ -121,7 +121,7 @@ write_string(garray_T *gap, char_u *str)
  * Return FAIL or OK.
  */
     static int
-json_encode_item(garray_T *gap, typval_T *val, int copyID)
+json_encode_item(garray_T *gap, typval_T *val, int copyID, int allow_none)
 {
     char_u	numbuf[NUMBUFLEN];
     char_u	*res;
@@ -135,7 +135,10 @@ json_encode_item(garray_T *gap, typval_T
 	    {
 		case VVAL_FALSE: ga_concat(gap, (char_u *)"false"); break;
 		case VVAL_TRUE: ga_concat(gap, (char_u *)"true"); break;
-		case VVAL_NONE: break;
+		case VVAL_NONE: if (!allow_none)
+				    /* TODO: better error */
+				    EMSG(_(e_invarg));
+				break;
 		case VVAL_NULL: ga_concat(gap, (char_u *)"null"); break;
 	    }
 	    break;
@@ -152,7 +155,7 @@ json_encode_item(garray_T *gap, typval_T
 	    break;
 
 	case VAR_FUNC:
-	    /* no JSON equivalent */
+	    /* no JSON equivalent TODO: better error */
 	    EMSG(_(e_invarg));
 	    return FAIL;
 
@@ -172,7 +175,8 @@ json_encode_item(garray_T *gap, typval_T
 		    ga_append(gap, '[');
 		    for (li = l->lv_first; li != NULL && !got_int; )
 		    {
-			if (json_encode_item(gap, &li->li_tv, copyID) == FAIL)
+			if (json_encode_item(gap, &li->li_tv, copyID, TRUE)
+								      == FAIL)
 			    return FAIL;
 			li = li->li_next;
 			if (li != NULL)
@@ -213,7 +217,7 @@ json_encode_item(garray_T *gap, typval_T
 			    write_string(gap, hi->hi_key);
 			    ga_append(gap, ':');
 			    if (json_encode_item(gap, &dict_lookup(hi)->di_tv,
-							      copyID) == FAIL)
+						       copyID, FALSE) == FAIL)
 				return FAIL;
 			}
 		    ga_append(gap, '}');
--- a/src/testdir/test_json.vim
+++ b/src/testdir/test_json.vim
@@ -74,6 +74,7 @@ func Test_encode()
 
   call assert_fails('echo jsonencode(function("tr"))', 'E474:')
   call assert_fails('echo jsonencode([function("tr")])', 'E474:')
+  call assert_fails('echo jsonencode({"key":v:none})', 'E474:')
 endfunc
 
 func Test_decode()
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1269,
+/**/
     1268,
 /**/
     1267,