diff options
author | erw7 <erw7.github@gmail.com> | 2020-07-20 18:01:14 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-20 11:01:14 +0200 |
commit | 950ca6abcdb4421a36b701d847421cb1eb86d8f2 (patch) | |
tree | 10e887291441ef359421b1125f5d8c3b18d3e012 /src | |
parent | 398201cfabaef47aa93c8a485336a00ef075ad3e (diff) | |
download | rneovim-950ca6abcdb4421a36b701d847421cb1eb86d8f2.tar.gz rneovim-950ca6abcdb4421a36b701d847421cb1eb86d8f2.tar.bz2 rneovim-950ca6abcdb4421a36b701d847421cb1eb86d8f2.zip |
eval: improve ex_execute (#12445)
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 31 |
1 files changed, 7 insertions, 24 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 0a83c3a586..0cad5fd6c1 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -8539,27 +8539,6 @@ void set_selfdict(typval_T *const rettv, dict_T *const selfdict) make_partial(selfdict, rettv); } -// Turn a typeval into a string. Similar to tv_get_string_buf() but uses -// string() on Dict, List, etc. -static const char *tv_stringify(typval_T *varp, char *buf) - FUNC_ATTR_NONNULL_ALL -{ - if (varp->v_type == VAR_LIST - || varp->v_type == VAR_DICT - || varp->v_type == VAR_FUNC - || varp->v_type == VAR_PARTIAL - || varp->v_type == VAR_FLOAT) { - typval_T tmp; - - f_string(varp, &tmp, NULL); - const char *const res = tv_get_string_buf(&tmp, buf); - tv_clear(varp); - *varp = tmp; - return res; - } - return tv_get_string_buf(varp, buf); -} - // Find variable "name" in the list of variables. // Return a pointer to it if found, NULL if not found. // Careful: "a:0" variables don't have a name. @@ -9406,16 +9385,20 @@ void ex_execute(exarg_T *eap) } if (!eap->skip) { - char buf[NUMBUFLEN]; const char *const argstr = eap->cmdidx == CMD_execute - ? tv_get_string_buf(&rettv, buf) - : tv_stringify(&rettv, buf); + ? tv_get_string(&rettv) + : rettv.v_type == VAR_STRING + ? encode_tv2echo(&rettv, NULL) + : encode_tv2string(&rettv, NULL); const size_t len = strlen(argstr); ga_grow(&ga, len + 2); if (!GA_EMPTY(&ga)) { ((char_u *)(ga.ga_data))[ga.ga_len++] = ' '; } memcpy((char_u *)(ga.ga_data) + ga.ga_len, argstr, len + 1); + if (eap->cmdidx != CMD_execute) { + xfree((void *)argstr); + } ga.ga_len += len; } |