]> granicus.if.org Git - vim/commitdiff
patch 7.4.1269 v7.4.1269
authorBram Moolenaar <Bram@vim.org>
Sat, 6 Feb 2016 17:42:07 +0000 (18:42 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 6 Feb 2016 17:42:07 +0000 (18:42 +0100)
Problem:    Encoding {'key':} to JSON doesn't give an error (Tyru)
Solution:   Give an error.

src/json.c
src/testdir/test_json.vim
src/version.c

index b6fce02dc7848a060ff3a2d20a91ca3ff5c3bfae..6688437aee437b704bbea688962f5b86b433c80d 100644 (file)
@@ -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 *val, int copyID)
            {
                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 *val, int copyID)
            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 *val, int copyID)
                    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 *val, int copyID)
                            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, '}');
index beabec883e0b6381c30cccf6f8beb5c3b0c8b358..05c394968754fb6575e8d5d0d2dfce57047206ad 100644 (file)
@@ -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()
index d5552e05f123c9a6c8023d2523bece2f31a52661..626639a1c5411eaae1f0953491f576c1339165e6 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1269,
 /**/
     1268,
 /**/