Mercurial > vim
changeset 5973:99d8f2d72dcd v7.4.327
updated for version 7.4.327
Problem: When 'verbose' is set to display the return value of a function,
may get E724 repeatedly.
Solution: Do not give an error for verbose messages. Abort conversion to
string after an error.
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Tue, 17 Jun 2014 12:51:16 +0200 |
parents | 6e8b6a7f7bff |
children | 232566824772 |
files | src/eval.c src/version.c |
diffstat | 2 files changed, 28 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -134,6 +134,9 @@ static int current_copyID = 0; #define COPYID_INC 2 #define COPYID_MASK (~0x1) +/* Abort conversion to string after a recursion error. */ +static int did_echo_string_emsg = FALSE; + /* * Array to hold the hashtab with variables local to each sourced script. * Each item holds a variable (nameless) that points to the dict_T. @@ -6686,6 +6689,8 @@ list_join_inner(gap, l, sep, echo_style, } line_breakcheck(); + if (did_echo_string_emsg) /* recursion error, bail out */ + break; } /* Allocate result buffer with its total size, avoid re-allocation and @@ -7460,8 +7465,10 @@ dict2string(tv, copyID) if (s != NULL) ga_concat(&ga, s); vim_free(tofree); - if (s == NULL) - break; + if (s == NULL || did_echo_string_emsg) + break; + line_breakcheck(); + } } if (todo > 0) @@ -7619,9 +7626,16 @@ echo_string(tv, tofree, numbuf, copyID) if (recurse >= DICT_MAXNEST) { - EMSG(_("E724: variable nested too deep for displaying")); + if (!did_echo_string_emsg) + { + /* Only give this message once for a recursive call to avoid + * flooding the user with errors. And stop iterating over lists + * and dicts. */ + did_echo_string_emsg = TRUE; + EMSG(_("E724: variable nested too deep for displaying")); + } *tofree = NULL; - return NULL; + return (char_u *)"{E724}"; } ++recurse; @@ -7689,7 +7703,8 @@ echo_string(tv, tofree, numbuf, copyID) *tofree = NULL; } - --recurse; + if (--recurse == 0) + did_echo_string_emsg = FALSE; return r; } @@ -23303,7 +23318,10 @@ call_user_func(fp, argcount, argvars, re msg_outnum((long)argvars[i].vval.v_number); else { + /* Do not want errors such as E724 here. */ + ++emsg_off; s = tv2string(&argvars[i], &tofree, numbuf2, 0); + --emsg_off; if (s != NULL) { if (vim_strsize(s) > MSG_BUF_CLEN) @@ -23395,8 +23413,10 @@ call_user_func(fp, argcount, argvars, re /* The value may be very long. Skip the middle part, so that we * have some idea how it starts and ends. smsg() would always - * truncate it at the end. */ + * truncate it at the end. Don't want errors such as E724 here. */ + ++emsg_off; s = tv2string(fc->rettv, &tofree, numbuf2, 0); + --emsg_off; if (s != NULL) { if (vim_strsize(s) > MSG_BUF_CLEN)