diff options
-rw-r--r-- | src/eval.c | 30 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 27 insertions, 5 deletions
diff --git a/src/eval.c b/src/eval.c index 728b7d1e2..a350757da 100644 --- 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, copyID, join_gap) } 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) + 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, rettv, firstline, lastline, selfdict) 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, rettv, firstline, lastline, selfdict) /* 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) diff --git a/src/version.c b/src/version.c index 6cc3d072e..9215ae475 100644 --- a/src/version.c +++ b/src/version.c @@ -735,6 +735,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 327, +/**/ 326, /**/ 325, |