summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-06-17 12:51:16 +0200
committerBram Moolenaar <Bram@vim.org>2014-06-17 12:51:16 +0200
commit8502c704badd5f93875e56d887a6a1e5810d131f (patch)
tree10c46ad47557b1833ec8e0aab54b8ed6d7881e73
parentf0224c9f085849f4da87faa878279a641055fe83 (diff)
downloadvim-git-7.4.327.tar.gz
updated for version 7.4.327v7.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.
-rw-r--r--src/eval.c30
-rw-r--r--src/version.c2
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,