0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.0035: saving and restoring called_emsg is clumsy

Problem:    Saving and restoring called_emsg is clumsy.
Solution:   Count the number of error messages.
This commit is contained in:
Bram Moolenaar 2019-12-23 22:59:18 +01:00
parent 70188f5b23
commit 53989554a4
13 changed files with 32 additions and 51 deletions

View File

@ -3746,19 +3746,17 @@ maketitle(void)
if (stl_syntax & STL_IN_TITLE) if (stl_syntax & STL_IN_TITLE)
{ {
int use_sandbox = FALSE; int use_sandbox = FALSE;
int save_called_emsg = called_emsg; int called_emsg_before = called_emsg;
# ifdef FEAT_EVAL # ifdef FEAT_EVAL
use_sandbox = was_set_insecurely((char_u *)"titlestring", 0); use_sandbox = was_set_insecurely((char_u *)"titlestring", 0);
# endif # endif
called_emsg = FALSE;
build_stl_str_hl(curwin, title_str, sizeof(buf), build_stl_str_hl(curwin, title_str, sizeof(buf),
p_titlestring, use_sandbox, p_titlestring, use_sandbox,
0, maxlen, NULL, NULL); 0, maxlen, NULL, NULL);
if (called_emsg) if (called_emsg > called_emsg_before)
set_string_option_direct((char_u *)"titlestring", -1, set_string_option_direct((char_u *)"titlestring", -1,
(char_u *)"", OPT_FREE, SID_ERROR); (char_u *)"", OPT_FREE, SID_ERROR);
called_emsg |= save_called_emsg;
} }
else else
#endif #endif
@ -3879,19 +3877,17 @@ maketitle(void)
if (stl_syntax & STL_IN_ICON) if (stl_syntax & STL_IN_ICON)
{ {
int use_sandbox = FALSE; int use_sandbox = FALSE;
int save_called_emsg = called_emsg; int called_emsg_before = called_emsg;
# ifdef FEAT_EVAL # ifdef FEAT_EVAL
use_sandbox = was_set_insecurely((char_u *)"iconstring", 0); use_sandbox = was_set_insecurely((char_u *)"iconstring", 0);
# endif # endif
called_emsg = FALSE;
build_stl_str_hl(curwin, icon_str, sizeof(buf), build_stl_str_hl(curwin, icon_str, sizeof(buf),
p_iconstring, use_sandbox, p_iconstring, use_sandbox,
0, 0, NULL, NULL); 0, 0, NULL, NULL);
if (called_emsg) if (called_emsg > called_emsg_before)
set_string_option_direct((char_u *)"iconstring", -1, set_string_option_direct((char_u *)"iconstring", -1,
(char_u *)"", OPT_FREE, SID_ERROR); (char_u *)"", OPT_FREE, SID_ERROR);
called_emsg |= save_called_emsg;
} }
else else
#endif #endif

View File

@ -2370,17 +2370,15 @@ channel_exe_cmd(channel_T *channel, ch_part_T part, typval_T *argv)
if (STRCMP(cmd, "ex") == 0) if (STRCMP(cmd, "ex") == 0)
{ {
int save_called_emsg = called_emsg; int called_emsg_before = called_emsg;
called_emsg = FALSE;
ch_log(channel, "Executing ex command '%s'", (char *)arg); ch_log(channel, "Executing ex command '%s'", (char *)arg);
++emsg_silent; ++emsg_silent;
do_cmdline_cmd(arg); do_cmdline_cmd(arg);
--emsg_silent; --emsg_silent;
if (called_emsg) if (called_emsg > called_emsg_before)
ch_log(channel, "Ex command error: '%s'", ch_log(channel, "Ex command error: '%s'",
(char *)get_vim_var_str(VV_ERRMSG)); (char *)get_vim_var_str(VV_ERRMSG));
called_emsg = save_called_emsg;
} }
else if (STRCMP(cmd, "normal") == 0) else if (STRCMP(cmd, "normal") == 0)
{ {

View File

@ -650,14 +650,12 @@ win_redr_ruler(win_T *wp, int always, int ignore_pum)
#ifdef FEAT_STL_OPT #ifdef FEAT_STL_OPT
if (*p_ruf) if (*p_ruf)
{ {
int save_called_emsg = called_emsg; int called_emsg_before = called_emsg;
called_emsg = FALSE;
win_redr_custom(wp, TRUE); win_redr_custom(wp, TRUE);
if (called_emsg) if (called_emsg > called_emsg_before)
set_string_option_direct((char_u *)"rulerformat", -1, set_string_option_direct((char_u *)"rulerformat", -1,
(char_u *)"", OPT_FREE, SID_ERROR); (char_u *)"", OPT_FREE, SID_ERROR);
called_emsg |= save_called_emsg;
return; return;
} }
#endif #endif

View File

@ -167,7 +167,7 @@ check_due_timer(void)
// the current scope, such as being inside a try/catch. // the current scope, such as being inside a try/catch.
timer_busy = timer_busy > 0 || vgetc_busy > 0; timer_busy = timer_busy > 0 || vgetc_busy > 0;
vgetc_busy = 0; vgetc_busy = 0;
called_emsg = FALSE; called_emsg = 0;
did_emsg = FALSE; did_emsg = FALSE;
did_uncaught_emsg = FALSE; did_uncaught_emsg = FALSE;
must_redraw = 0; must_redraw = 0;

View File

@ -226,7 +226,7 @@ EXTERN int did_uncaught_emsg; // emsg() was called and did not
#endif #endif
EXTERN int did_emsg_syntax; // did_emsg set because of a EXTERN int did_emsg_syntax; // did_emsg set because of a
// syntax error // syntax error
EXTERN int called_emsg; // always set by emsg() EXTERN int called_emsg; // always incremented by emsg()
EXTERN int ex_exitval INIT(= 0); // exit value for ex mode EXTERN int ex_exitval INIT(= 0); // exit value for ex mode
EXTERN int emsg_on_display INIT(= FALSE); // there is an error message EXTERN int emsg_on_display INIT(= FALSE); // there is an error message
EXTERN int rc_did_emsg INIT(= FALSE); // vim_regcomp() called emsg() EXTERN int rc_did_emsg INIT(= FALSE); // vim_regcomp() called emsg()

View File

@ -3704,14 +3704,12 @@ get_tabline_label(
if (**opt != NUL) if (**opt != NUL)
{ {
int use_sandbox = FALSE; int use_sandbox = FALSE;
int save_called_emsg = called_emsg; int called_emsg_before = called_emsg;
char_u res[MAXPATHL]; char_u res[MAXPATHL];
tabpage_T *save_curtab; tabpage_T *save_curtab;
char_u *opt_name = (char_u *)(tooltip ? "guitabtooltip" char_u *opt_name = (char_u *)(tooltip ? "guitabtooltip"
: "guitablabel"); : "guitablabel");
called_emsg = FALSE;
printer_page_num = tabpage_index(tp); printer_page_num = tabpage_index(tp);
# ifdef FEAT_EVAL # ifdef FEAT_EVAL
set_vim_var_nr(VV_LNUM, printer_page_num); set_vim_var_nr(VV_LNUM, printer_page_num);
@ -3742,10 +3740,9 @@ get_tabline_label(
curwin = curtab->tp_curwin; curwin = curtab->tp_curwin;
curbuf = curwin->w_buffer; curbuf = curwin->w_buffer;
if (called_emsg) if (called_emsg > called_emsg_before)
set_string_option_direct(opt_name, -1, set_string_option_direct(opt_name, -1,
(char_u *)"", OPT_FREE, SID_ERROR); (char_u *)"", OPT_FREE, SID_ERROR);
called_emsg |= save_called_emsg;
} }
// If 'guitablabel'/'guitabtooltip' is not set or the result is empty then // If 'guitablabel'/'guitabtooltip' is not set or the result is empty then

View File

@ -4055,7 +4055,7 @@ next_search_hl(
linenr_T l; linenr_T l;
colnr_T matchcol; colnr_T matchcol;
long nmatched; long nmatched;
int save_called_emsg = called_emsg; int called_emsg_before = called_emsg;
// for :{range}s/pat only highlight inside the range // for :{range}s/pat only highlight inside the range
if (lnum < search_first_line || lnum > search_last_line) if (lnum < search_first_line || lnum > search_last_line)
@ -4081,7 +4081,6 @@ next_search_hl(
* Repeat searching for a match until one is found that includes "mincol" * Repeat searching for a match until one is found that includes "mincol"
* or none is found in this line. * or none is found in this line.
*/ */
called_emsg = FALSE;
for (;;) for (;;)
{ {
# ifdef FEAT_RELTIME # ifdef FEAT_RELTIME
@ -4143,7 +4142,7 @@ next_search_hl(
if (regprog_is_copy) if (regprog_is_copy)
cur->match.regprog = cur->hl.rm.regprog; cur->match.regprog = cur->hl.rm.regprog;
if (called_emsg || got_int || timed_out) if (called_emsg > called_emsg_before || got_int || timed_out)
{ {
// Error while handling regexp: stop using this regexp. // Error while handling regexp: stop using this regexp.
if (shl == search_hl) if (shl == search_hl)
@ -4176,9 +4175,6 @@ next_search_hl(
break; // useful match found break; // useful match found
} }
} }
// Restore called_emsg for assert_fails().
called_emsg = save_called_emsg;
} }
/* /*

View File

@ -4140,7 +4140,7 @@ cmdsrv_main(
if (xterm_dpy != NULL) if (xterm_dpy != NULL)
res = serverGetVimNames(xterm_dpy); res = serverGetVimNames(xterm_dpy);
# endif # endif
if (called_emsg) if (did_emsg)
mch_errmsg("\n"); mch_errmsg("\n");
} }
else if (STRICMP(argv[i], "--servername") == 0) else if (STRICMP(argv[i], "--servername") == 0)

View File

@ -581,7 +581,7 @@ ignore_error(char_u *msg)
#if !defined(HAVE_STRERROR) || defined(PROTO) #if !defined(HAVE_STRERROR) || defined(PROTO)
/* /*
* Replacement for perror() that behaves more or less like emsg() was called. * Replacement for perror() that behaves more or less like emsg() was called.
* v:errmsg will be set and called_emsg will be set. * v:errmsg will be set and called_emsg will be incremented.
*/ */
void void
do_perror(char *msg) do_perror(char *msg)
@ -620,7 +620,7 @@ emsg_core(char_u *s)
return msg_use_printf() ? FALSE : msg((char *)s); return msg_use_printf() ? FALSE : msg((char *)s);
#endif #endif
called_emsg = TRUE; ++called_emsg;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
// If "emsg_severe" is TRUE: When an error exception is to be thrown, // If "emsg_severe" is TRUE: When an error exception is to be thrown,

View File

@ -2556,7 +2556,7 @@ vim_regcomp(char_u *expr_arg, int re_flags)
{ {
regprog_T *prog = NULL; regprog_T *prog = NULL;
char_u *expr = expr_arg; char_u *expr = expr_arg;
int save_called_emsg; int called_emsg_before;
regexp_engine = p_re; regexp_engine = p_re;
@ -2592,8 +2592,7 @@ vim_regcomp(char_u *expr_arg, int re_flags)
/* /*
* First try the NFA engine, unless backtracking was requested. * First try the NFA engine, unless backtracking was requested.
*/ */
save_called_emsg = called_emsg; called_emsg_before = called_emsg;
called_emsg = FALSE;
if (regexp_engine != BACKTRACKING_ENGINE) if (regexp_engine != BACKTRACKING_ENGINE)
prog = nfa_regengine.regcomp(expr, prog = nfa_regengine.regcomp(expr,
re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0)); re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0));
@ -2624,13 +2623,13 @@ vim_regcomp(char_u *expr_arg, int re_flags)
* but are still valid patterns, thus a retry should work. * but are still valid patterns, thus a retry should work.
* But don't try if an error message was given. * But don't try if an error message was given.
*/ */
if (regexp_engine == AUTOMATIC_ENGINE && !called_emsg) if (regexp_engine == AUTOMATIC_ENGINE
&& called_emsg == called_emsg_before)
{ {
regexp_engine = BACKTRACKING_ENGINE; regexp_engine = BACKTRACKING_ENGINE;
prog = bt_regengine.regcomp(expr, re_flags); prog = bt_regengine.regcomp(expr, re_flags);
} }
} }
called_emsg |= save_called_emsg;
if (prog != NULL) if (prog != NULL)
{ {

View File

@ -624,7 +624,7 @@ searchit(
long nmatched; long nmatched;
int submatch = 0; int submatch = 0;
int first_match = TRUE; int first_match = TRUE;
int save_called_emsg = called_emsg; int called_emsg_before = called_emsg;
#ifdef FEAT_SEARCH_EXTRA #ifdef FEAT_SEARCH_EXTRA
int break_loop = FALSE; int break_loop = FALSE;
#endif #endif
@ -654,7 +654,6 @@ searchit(
/* /*
* find the string * find the string
*/ */
called_emsg = FALSE;
do // loop for count do // loop for count
{ {
// When not accepting a match at the start position set "extra_col" to // When not accepting a match at the start position set "extra_col" to
@ -745,7 +744,7 @@ searchit(
#endif #endif
); );
// Abort searching on an error (e.g., out of stack). // Abort searching on an error (e.g., out of stack).
if (called_emsg if (called_emsg > called_emsg_before
#ifdef FEAT_RELTIME #ifdef FEAT_RELTIME
|| (timed_out != NULL && *timed_out) || (timed_out != NULL && *timed_out)
#endif #endif
@ -1055,7 +1054,8 @@ searchit(
* specified, after an interrupt, after a match and after looping * specified, after an interrupt, after a match and after looping
* twice. * twice.
*/ */
if (!p_ws || stop_lnum != 0 || got_int || called_emsg if (!p_ws || stop_lnum != 0 || got_int
|| called_emsg > called_emsg_before
#ifdef FEAT_RELTIME #ifdef FEAT_RELTIME
|| (timed_out != NULL && *timed_out) || (timed_out != NULL && *timed_out)
#endif #endif
@ -1082,7 +1082,7 @@ searchit(
if (extra_arg != NULL) if (extra_arg != NULL)
extra_arg->sa_wrapped = TRUE; extra_arg->sa_wrapped = TRUE;
} }
if (got_int || called_emsg if (got_int || called_emsg > called_emsg_before
#ifdef FEAT_RELTIME #ifdef FEAT_RELTIME
|| (timed_out != NULL && *timed_out) || (timed_out != NULL && *timed_out)
#endif #endif
@ -1096,8 +1096,6 @@ searchit(
vim_regfree(regmatch.regprog); vim_regfree(regmatch.regprog);
called_emsg |= save_called_emsg;
if (!found) // did not find it if (!found) // did not find it
{ {
if (got_int) if (got_int)
@ -4799,7 +4797,7 @@ is_zero_width(char_u *pattern, int move, pos_T *cur, int direction)
int nmatched = 0; int nmatched = 0;
int result = -1; int result = -1;
pos_T pos; pos_T pos;
int save_called_emsg = called_emsg; int called_emsg_before = called_emsg;
int flag = 0; int flag = 0;
if (pattern == NULL) if (pattern == NULL)
@ -4828,7 +4826,6 @@ is_zero_width(char_u *pattern, int move, pos_T *cur, int direction)
{ {
// Zero-width pattern should match somewhere, then we can check if // Zero-width pattern should match somewhere, then we can check if
// start and end are in the same position. // start and end are in the same position.
called_emsg = FALSE;
do do
{ {
regmatch.startpos[0].col++; regmatch.startpos[0].col++;
@ -4839,7 +4836,7 @@ is_zero_width(char_u *pattern, int move, pos_T *cur, int direction)
} while (direction == FORWARD ? regmatch.startpos[0].col < pos.col } while (direction == FORWARD ? regmatch.startpos[0].col < pos.col
: regmatch.startpos[0].col > pos.col); : regmatch.startpos[0].col > pos.col);
if (!called_emsg) if (called_emsg == called_emsg_before)
{ {
result = (nmatched != 0 result = (nmatched != 0
&& regmatch.startpos[0].lnum == regmatch.endpos[0].lnum && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum
@ -4847,7 +4844,6 @@ is_zero_width(char_u *pattern, int move, pos_T *cur, int direction)
} }
} }
called_emsg |= save_called_emsg;
vim_regfree(regmatch.regprog); vim_regfree(regmatch.regprog);
return result; return result;
} }

View File

@ -424,15 +424,15 @@ f_assert_fails(typval_T *argvars, typval_T *rettv)
char_u *cmd = tv_get_string_chk(&argvars[0]); char_u *cmd = tv_get_string_chk(&argvars[0]);
garray_T ga; garray_T ga;
int save_trylevel = trylevel; int save_trylevel = trylevel;
int called_emsg_before = called_emsg;
// trylevel must be zero for a ":throw" command to be considered failed // trylevel must be zero for a ":throw" command to be considered failed
trylevel = 0; trylevel = 0;
called_emsg = FALSE;
suppress_errthrow = TRUE; suppress_errthrow = TRUE;
emsg_silent = TRUE; emsg_silent = TRUE;
do_cmdline_cmd(cmd); do_cmdline_cmd(cmd);
if (!called_emsg) if (called_emsg == called_emsg_before)
{ {
prepare_assert_error(&ga); prepare_assert_error(&ga);
ga_concat(&ga, (char_u *)"command did not fail: "); ga_concat(&ga, (char_u *)"command did not fail: ");
@ -461,7 +461,6 @@ f_assert_fails(typval_T *argvars, typval_T *rettv)
} }
trylevel = save_trylevel; trylevel = save_trylevel;
called_emsg = FALSE;
suppress_errthrow = FALSE; suppress_errthrow = FALSE;
emsg_silent = FALSE; emsg_silent = FALSE;
emsg_on_display = FALSE; emsg_on_display = FALSE;

View File

@ -742,6 +742,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
35,
/**/ /**/
34, 34,
/**/ /**/