diff options
author | ZyX <kp-pav@yandex.ru> | 2016-12-25 19:37:13 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2017-01-03 06:39:23 +0300 |
commit | c5c75513b81398f05a4e63b2f7207ae74de25ecc (patch) | |
tree | 336a14150e8b59d04fdc9b8bae28a8dd99ccc5c0 /src/nvim/eval.c | |
parent | efe1476d4293170496f0e933a4d3c955f0559b03 (diff) | |
download | rneovim-c5c75513b81398f05a4e63b2f7207ae74de25ecc.tar.gz rneovim-c5c75513b81398f05a4e63b2f7207ae74de25ecc.tar.bz2 rneovim-c5c75513b81398f05a4e63b2f7207ae74de25ecc.zip |
eval/typval_encode: Make partial conversions not recursive
Is known to crash in the current state.
Ref #5825.
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index ea42a58cdd..dbc279685a 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -19070,22 +19070,24 @@ void free_tv(typval_T *varp) #define TYPVAL_ENCODE_CONV_EXT_STRING(ignored1, ignored2, ignored3) -#define TYPVAL_ENCODE_CONV_FUNC(fun) \ +#define TYPVAL_ENCODE_CONV_FUNC_START(fun, is_partial, pt) \ do { \ - func_unref(fun); \ - if (fun != empty_string) { \ - xfree(fun); \ + if (is_partial) { \ + partial_unref(pt); \ + tv->vval.v_partial = NULL; \ + } else { \ + func_unref(fun); \ + if (fun != empty_string) { \ + xfree(fun); \ + } \ + tv->vval.v_string = NULL; \ } \ - tv->vval.v_string = NULL; \ tv->v_lock = VAR_UNLOCKED; \ } while (0) -#define TYPVAL_ENCODE_CONV_PARTIAL(pt) \ - do { \ - partial_unref(pt); \ - pt = NULL; \ - tv->v_lock = VAR_UNLOCKED; \ - } while (0) +#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(len) +#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(len) +#define TYPVAL_ENCODE_CONV_FUNC_END() #define TYPVAL_ENCODE_CONV_EMPTY_LIST() \ do { \ @@ -19162,8 +19164,10 @@ TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(static, nothing, void *, ignored) #undef TYPVAL_ENCODE_CONV_STRING #undef TYPVAL_ENCODE_CONV_STR_STRING #undef TYPVAL_ENCODE_CONV_EXT_STRING -#undef TYPVAL_ENCODE_CONV_FUNC -#undef TYPVAL_ENCODE_CONV_PARTIAL +#undef TYPVAL_ENCODE_CONV_FUNC_START +#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS +#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF +#undef TYPVAL_ENCODE_CONV_FUNC_END #undef TYPVAL_ENCODE_CONV_EMPTY_LIST #undef TYPVAL_ENCODE_CONV_EMPTY_DICT #undef TYPVAL_ENCODE_CONV_LIST_START |