# HG changeset patch # User Bram Moolenaar # Date 1403002276 -7200 # Node ID 99d8f2d72dcd4b850de81998cc9b1120c8165762 # Parent 6e8b6a7f7bff623f15391d7a47bf3e106ebc9850 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. diff --git a/src/eval.c b/src/eval.c --- 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) diff --git a/src/version.c b/src/version.c --- 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,