From bda0165514a582978c2da672b528562df78a2d1a Mon Sep 17 00:00:00 2001 From: ZyX Date: Mon, 4 Apr 2016 04:53:07 +0300 Subject: eval/encode: Make sure that encoder can encode NULL variables Adds two undocumented v: variables: _null_list and _null_dict because I do not know a reproducible way to get such lists (though I think I heard about this) and dictionaries (do not remember hearing about them). NULL strings are obtained using $XXX_UNEXISTENT_VAR_XXX. Fixes crash in json_encode($XXX_UNEXISTENT_VAR_XXX). Other added tests worked fine before this commit. --- src/nvim/eval.c | 2 ++ src/nvim/eval.h | 2 ++ src/nvim/eval/encode.c | 5 ++++- 3 files changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 204c0fb1ef..aaad9fab34 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -379,6 +379,8 @@ static struct vimvar { VV(VV_FALSE, "false", VAR_SPECIAL, VV_RO), VV(VV_TRUE, "true", VAR_SPECIAL, VV_RO), VV(VV_NULL, "null", VAR_SPECIAL, VV_RO), + VV(VV__NULL_LIST, "_null_list", VAR_LIST, VV_RO), + VV(VV__NULL_DICT, "_null_dict", VAR_DICT, VV_RO), }; #undef VV diff --git a/src/nvim/eval.h b/src/nvim/eval.h index f81eb5d063..d6800afd52 100644 --- a/src/nvim/eval.h +++ b/src/nvim/eval.h @@ -122,6 +122,8 @@ typedef enum { VV_FALSE, VV_TRUE, VV_NULL, + VV__NULL_LIST, // List with NULL value. For test purposes only. + VV__NULL_DICT, // Dictionary with NULL value. For test purposes only. } VimVarIndex; /// All recognized msgpack types diff --git a/src/nvim/eval/encode.c b/src/nvim/eval/encode.c index 0bde6562b8..88c731e92a 100644 --- a/src/nvim/eval/encode.c +++ b/src/nvim/eval/encode.c @@ -287,6 +287,9 @@ int encode_read_from_list(ListReaderState *const state, char *const buf, (val)->copyID_attr = copyID; \ } while (0) +#define TV_STRLEN(tv) \ + (tv->vval.v_string == NULL ? 0 : STRLEN(tv->vval.v_string)) + /// Define functions which convert VimL value to something else /// /// Creates function `vim_to_{name}(firstargtype firstargname, typval_T *const @@ -306,7 +309,7 @@ static int name##_convert_one_value(firstargtype firstargname, \ { \ switch (tv->v_type) { \ case VAR_STRING: { \ - CONV_STRING(tv->vval.v_string, STRLEN(tv->vval.v_string)); \ + CONV_STRING(tv->vval.v_string, TV_STRLEN(tv)); \ break; \ } \ case VAR_NUMBER: { \ -- cgit