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)
--- 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,