To: vim_dev@googlegroups.com Subject: Patch 8.2.0035 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0035 Problem: Saving and restoring called_emsg is clumsy. Solution: Count the number of error messages. Files: src/message.c, src/buffer.c, src/channel.c, src/drawscreen.c, src/ex_cmds2.c, src/gui.c, src/highlight.c, src/main.c, src/regexp.c, src/search.c, src/testing.c, src/globals.h *** ../vim-8.2.0034/src/message.c 2019-12-21 18:25:50.453560468 +0100 --- src/message.c 2019-12-23 22:42:09.551865028 +0100 *************** *** 581,587 **** #if !defined(HAVE_STRERROR) || defined(PROTO) /* * Replacement for perror() that behaves more or less like emsg() was called. ! * v:errmsg will be set and called_emsg will be set. */ void do_perror(char *msg) --- 581,587 ---- #if !defined(HAVE_STRERROR) || defined(PROTO) /* * Replacement for perror() that behaves more or less like emsg() was called. ! * v:errmsg will be set and called_emsg will be incremented. */ void do_perror(char *msg) *************** *** 620,626 **** return msg_use_printf() ? FALSE : msg((char *)s); #endif ! called_emsg = TRUE; #ifdef FEAT_EVAL // If "emsg_severe" is TRUE: When an error exception is to be thrown, --- 620,626 ---- return msg_use_printf() ? FALSE : msg((char *)s); #endif ! ++called_emsg; #ifdef FEAT_EVAL // If "emsg_severe" is TRUE: When an error exception is to be thrown, *** ../vim-8.2.0034/src/buffer.c 2019-12-14 16:18:11.574458417 +0100 --- src/buffer.c 2019-12-23 22:43:20.603634830 +0100 *************** *** 3746,3764 **** if (stl_syntax & STL_IN_TITLE) { int use_sandbox = FALSE; ! int save_called_emsg = called_emsg; # ifdef FEAT_EVAL use_sandbox = was_set_insecurely((char_u *)"titlestring", 0); # endif - called_emsg = FALSE; build_stl_str_hl(curwin, title_str, sizeof(buf), p_titlestring, use_sandbox, 0, maxlen, NULL, NULL); ! if (called_emsg) set_string_option_direct((char_u *)"titlestring", -1, (char_u *)"", OPT_FREE, SID_ERROR); - called_emsg |= save_called_emsg; } else #endif --- 3746,3762 ---- if (stl_syntax & STL_IN_TITLE) { int use_sandbox = FALSE; ! int called_emsg_before = called_emsg; # ifdef FEAT_EVAL use_sandbox = was_set_insecurely((char_u *)"titlestring", 0); # endif build_stl_str_hl(curwin, title_str, sizeof(buf), p_titlestring, use_sandbox, 0, maxlen, NULL, NULL); ! if (called_emsg > called_emsg_before) set_string_option_direct((char_u *)"titlestring", -1, (char_u *)"", OPT_FREE, SID_ERROR); } else #endif *************** *** 3879,3897 **** if (stl_syntax & STL_IN_ICON) { int use_sandbox = FALSE; ! int save_called_emsg = called_emsg; # ifdef FEAT_EVAL use_sandbox = was_set_insecurely((char_u *)"iconstring", 0); # endif - called_emsg = FALSE; build_stl_str_hl(curwin, icon_str, sizeof(buf), p_iconstring, use_sandbox, 0, 0, NULL, NULL); ! if (called_emsg) set_string_option_direct((char_u *)"iconstring", -1, (char_u *)"", OPT_FREE, SID_ERROR); - called_emsg |= save_called_emsg; } else #endif --- 3877,3893 ---- if (stl_syntax & STL_IN_ICON) { int use_sandbox = FALSE; ! int called_emsg_before = called_emsg; # ifdef FEAT_EVAL use_sandbox = was_set_insecurely((char_u *)"iconstring", 0); # endif build_stl_str_hl(curwin, icon_str, sizeof(buf), p_iconstring, use_sandbox, 0, 0, NULL, NULL); ! if (called_emsg > called_emsg_before) set_string_option_direct((char_u *)"iconstring", -1, (char_u *)"", OPT_FREE, SID_ERROR); } else #endif *** ../vim-8.2.0034/src/channel.c 2019-12-22 18:28:48.252481062 +0100 --- src/channel.c 2019-12-23 22:43:42.931562222 +0100 *************** *** 2370,2386 **** if (STRCMP(cmd, "ex") == 0) { ! int save_called_emsg = called_emsg; - called_emsg = FALSE; ch_log(channel, "Executing ex command '%s'", (char *)arg); ++emsg_silent; do_cmdline_cmd(arg); --emsg_silent; ! if (called_emsg) ch_log(channel, "Ex command error: '%s'", (char *)get_vim_var_str(VV_ERRMSG)); - called_emsg = save_called_emsg; } else if (STRCMP(cmd, "normal") == 0) { --- 2370,2384 ---- if (STRCMP(cmd, "ex") == 0) { ! int called_emsg_before = called_emsg; ch_log(channel, "Executing ex command '%s'", (char *)arg); ++emsg_silent; do_cmdline_cmd(arg); --emsg_silent; ! if (called_emsg > called_emsg_before) ch_log(channel, "Ex command error: '%s'", (char *)get_vim_var_str(VV_ERRMSG)); } else if (STRCMP(cmd, "normal") == 0) { *** ../vim-8.2.0034/src/drawscreen.c 2019-11-30 22:40:44.000000000 +0100 --- src/drawscreen.c 2019-12-23 22:44:14.631458953 +0100 *************** *** 650,663 **** #ifdef FEAT_STL_OPT if (*p_ruf) { ! int save_called_emsg = called_emsg; - called_emsg = FALSE; win_redr_custom(wp, TRUE); ! if (called_emsg) set_string_option_direct((char_u *)"rulerformat", -1, (char_u *)"", OPT_FREE, SID_ERROR); - called_emsg |= save_called_emsg; return; } #endif --- 650,661 ---- #ifdef FEAT_STL_OPT if (*p_ruf) { ! int called_emsg_before = called_emsg; win_redr_custom(wp, TRUE); ! if (called_emsg > called_emsg_before) set_string_option_direct((char_u *)"rulerformat", -1, (char_u *)"", OPT_FREE, SID_ERROR); return; } #endif *** ../vim-8.2.0034/src/ex_cmds2.c 2019-12-01 21:24:22.000000000 +0100 --- src/ex_cmds2.c 2019-12-23 22:45:35.319195204 +0100 *************** *** 167,173 **** // the current scope, such as being inside a try/catch. timer_busy = timer_busy > 0 || vgetc_busy > 0; vgetc_busy = 0; ! called_emsg = FALSE; did_emsg = FALSE; did_uncaught_emsg = FALSE; must_redraw = 0; --- 167,173 ---- // the current scope, such as being inside a try/catch. timer_busy = timer_busy > 0 || vgetc_busy > 0; vgetc_busy = 0; ! called_emsg = 0; did_emsg = FALSE; did_uncaught_emsg = FALSE; must_redraw = 0; *** ../vim-8.2.0034/src/gui.c 2019-12-18 21:33:19.276859673 +0100 --- src/gui.c 2019-12-23 22:46:10.947078337 +0100 *************** *** 3704,3717 **** if (**opt != NUL) { int use_sandbox = FALSE; ! int save_called_emsg = called_emsg; char_u res[MAXPATHL]; tabpage_T *save_curtab; char_u *opt_name = (char_u *)(tooltip ? "guitabtooltip" : "guitablabel"); - called_emsg = FALSE; - printer_page_num = tabpage_index(tp); # ifdef FEAT_EVAL set_vim_var_nr(VV_LNUM, printer_page_num); --- 3704,3715 ---- if (**opt != NUL) { int use_sandbox = FALSE; ! int called_emsg_before = called_emsg; char_u res[MAXPATHL]; tabpage_T *save_curtab; char_u *opt_name = (char_u *)(tooltip ? "guitabtooltip" : "guitablabel"); printer_page_num = tabpage_index(tp); # ifdef FEAT_EVAL set_vim_var_nr(VV_LNUM, printer_page_num); *************** *** 3742,3751 **** curwin = curtab->tp_curwin; curbuf = curwin->w_buffer; ! if (called_emsg) set_string_option_direct(opt_name, -1, (char_u *)"", OPT_FREE, SID_ERROR); - called_emsg |= save_called_emsg; } // If 'guitablabel'/'guitabtooltip' is not set or the result is empty then --- 3740,3748 ---- curwin = curtab->tp_curwin; curbuf = curwin->w_buffer; ! if (called_emsg > called_emsg_before) set_string_option_direct(opt_name, -1, (char_u *)"", OPT_FREE, SID_ERROR); } // If 'guitablabel'/'guitabtooltip' is not set or the result is empty then *** ../vim-8.2.0034/src/highlight.c 2019-12-05 18:33:11.000000000 +0100 --- src/highlight.c 2019-12-23 22:47:03.090906901 +0100 *************** *** 4055,4061 **** linenr_T l; colnr_T matchcol; long nmatched; ! int save_called_emsg = called_emsg; // for :{range}s/pat only highlight inside the range if (lnum < search_first_line || lnum > search_last_line) --- 4055,4061 ---- linenr_T l; colnr_T matchcol; long nmatched; ! int called_emsg_before = called_emsg; // for :{range}s/pat only highlight inside the range if (lnum < search_first_line || lnum > search_last_line) *************** *** 4081,4087 **** * Repeat searching for a match until one is found that includes "mincol" * or none is found in this line. */ - called_emsg = FALSE; for (;;) { # ifdef FEAT_RELTIME --- 4081,4086 ---- *************** *** 4143,4149 **** if (regprog_is_copy) cur->match.regprog = cur->hl.rm.regprog; ! if (called_emsg || got_int || timed_out) { // Error while handling regexp: stop using this regexp. if (shl == search_hl) --- 4142,4148 ---- if (regprog_is_copy) cur->match.regprog = cur->hl.rm.regprog; ! if (called_emsg > called_emsg_before || got_int || timed_out) { // Error while handling regexp: stop using this regexp. if (shl == search_hl) *************** *** 4176,4184 **** break; // useful match found } } - - // Restore called_emsg for assert_fails(). - called_emsg = save_called_emsg; } /* --- 4175,4180 ---- *** ../vim-8.2.0034/src/main.c 2019-12-09 23:00:49.000000000 +0100 --- src/main.c 2019-12-23 22:47:40.362784102 +0100 *************** *** 4140,4146 **** if (xterm_dpy != NULL) res = serverGetVimNames(xterm_dpy); # endif ! if (called_emsg) mch_errmsg("\n"); } else if (STRICMP(argv[i], "--servername") == 0) --- 4140,4146 ---- if (xterm_dpy != NULL) res = serverGetVimNames(xterm_dpy); # endif ! if (did_emsg) mch_errmsg("\n"); } else if (STRICMP(argv[i], "--servername") == 0) *** ../vim-8.2.0034/src/regexp.c 2019-12-05 21:09:56.000000000 +0100 --- src/regexp.c 2019-12-23 22:48:53.138543793 +0100 *************** *** 2556,2562 **** { regprog_T *prog = NULL; char_u *expr = expr_arg; ! int save_called_emsg; regexp_engine = p_re; --- 2556,2562 ---- { regprog_T *prog = NULL; char_u *expr = expr_arg; ! int called_emsg_before; regexp_engine = p_re; *************** *** 2592,2599 **** /* * First try the NFA engine, unless backtracking was requested. */ ! save_called_emsg = called_emsg; ! called_emsg = FALSE; if (regexp_engine != BACKTRACKING_ENGINE) prog = nfa_regengine.regcomp(expr, re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0)); --- 2592,2598 ---- /* * First try the NFA engine, unless backtracking was requested. */ ! called_emsg_before = called_emsg; if (regexp_engine != BACKTRACKING_ENGINE) prog = nfa_regengine.regcomp(expr, re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0)); *************** *** 2624,2636 **** * but are still valid patterns, thus a retry should work. * But don't try if an error message was given. */ ! if (regexp_engine == AUTOMATIC_ENGINE && !called_emsg) { regexp_engine = BACKTRACKING_ENGINE; prog = bt_regengine.regcomp(expr, re_flags); } } - called_emsg |= save_called_emsg; if (prog != NULL) { --- 2623,2635 ---- * but are still valid patterns, thus a retry should work. * But don't try if an error message was given. */ ! if (regexp_engine == AUTOMATIC_ENGINE ! && called_emsg == called_emsg_before) { regexp_engine = BACKTRACKING_ENGINE; prog = bt_regengine.regcomp(expr, re_flags); } } if (prog != NULL) { *** ../vim-8.2.0034/src/search.c 2019-12-05 21:07:47.000000000 +0100 --- src/search.c 2019-12-23 22:50:32.378215085 +0100 *************** *** 624,630 **** long nmatched; int submatch = 0; int first_match = TRUE; ! int save_called_emsg = called_emsg; #ifdef FEAT_SEARCH_EXTRA int break_loop = FALSE; #endif --- 624,630 ---- long nmatched; int submatch = 0; int first_match = TRUE; ! int called_emsg_before = called_emsg; #ifdef FEAT_SEARCH_EXTRA int break_loop = FALSE; #endif *************** *** 654,660 **** /* * find the string */ - called_emsg = FALSE; do // loop for count { // When not accepting a match at the start position set "extra_col" to --- 654,659 ---- *************** *** 745,751 **** #endif ); // Abort searching on an error (e.g., out of stack). ! if (called_emsg #ifdef FEAT_RELTIME || (timed_out != NULL && *timed_out) #endif --- 744,750 ---- #endif ); // Abort searching on an error (e.g., out of stack). ! if (called_emsg > called_emsg_before #ifdef FEAT_RELTIME || (timed_out != NULL && *timed_out) #endif *************** *** 1055,1061 **** * specified, after an interrupt, after a match and after looping * twice. */ ! if (!p_ws || stop_lnum != 0 || got_int || called_emsg #ifdef FEAT_RELTIME || (timed_out != NULL && *timed_out) #endif --- 1054,1061 ---- * specified, after an interrupt, after a match and after looping * twice. */ ! if (!p_ws || stop_lnum != 0 || got_int ! || called_emsg > called_emsg_before #ifdef FEAT_RELTIME || (timed_out != NULL && *timed_out) #endif *************** *** 1082,1088 **** if (extra_arg != NULL) extra_arg->sa_wrapped = TRUE; } ! if (got_int || called_emsg #ifdef FEAT_RELTIME || (timed_out != NULL && *timed_out) #endif --- 1082,1088 ---- if (extra_arg != NULL) extra_arg->sa_wrapped = TRUE; } ! if (got_int || called_emsg > called_emsg_before #ifdef FEAT_RELTIME || (timed_out != NULL && *timed_out) #endif *************** *** 1096,1103 **** vim_regfree(regmatch.regprog); - called_emsg |= save_called_emsg; - if (!found) // did not find it { if (got_int) --- 1096,1101 ---- *************** *** 4799,4805 **** int nmatched = 0; int result = -1; pos_T pos; ! int save_called_emsg = called_emsg; int flag = 0; if (pattern == NULL) --- 4797,4803 ---- int nmatched = 0; int result = -1; pos_T pos; ! int called_emsg_before = called_emsg; int flag = 0; if (pattern == NULL) *************** *** 4828,4834 **** { // Zero-width pattern should match somewhere, then we can check if // start and end are in the same position. - called_emsg = FALSE; do { regmatch.startpos[0].col++; --- 4826,4831 ---- *************** *** 4839,4845 **** } while (direction == FORWARD ? regmatch.startpos[0].col < pos.col : regmatch.startpos[0].col > pos.col); ! if (!called_emsg) { result = (nmatched != 0 && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum --- 4836,4842 ---- } while (direction == FORWARD ? regmatch.startpos[0].col < pos.col : regmatch.startpos[0].col > pos.col); ! if (called_emsg == called_emsg_before) { result = (nmatched != 0 && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum *************** *** 4847,4853 **** } } - called_emsg |= save_called_emsg; vim_regfree(regmatch.regprog); return result; } --- 4844,4849 ---- *** ../vim-8.2.0034/src/testing.c 2019-12-05 21:32:23.000000000 +0100 --- src/testing.c 2019-12-23 22:51:30.262022789 +0100 *************** *** 424,438 **** char_u *cmd = tv_get_string_chk(&argvars[0]); garray_T ga; int save_trylevel = trylevel; // trylevel must be zero for a ":throw" command to be considered failed trylevel = 0; - called_emsg = FALSE; suppress_errthrow = TRUE; emsg_silent = TRUE; do_cmdline_cmd(cmd); ! if (!called_emsg) { prepare_assert_error(&ga); ga_concat(&ga, (char_u *)"command did not fail: "); --- 424,438 ---- char_u *cmd = tv_get_string_chk(&argvars[0]); garray_T ga; int save_trylevel = trylevel; + int called_emsg_before = called_emsg; // trylevel must be zero for a ":throw" command to be considered failed trylevel = 0; suppress_errthrow = TRUE; emsg_silent = TRUE; do_cmdline_cmd(cmd); ! if (called_emsg == called_emsg_before) { prepare_assert_error(&ga); ga_concat(&ga, (char_u *)"command did not fail: "); *************** *** 461,467 **** } trylevel = save_trylevel; - called_emsg = FALSE; suppress_errthrow = FALSE; emsg_silent = FALSE; emsg_on_display = FALSE; --- 461,466 ---- *** ../vim-8.2.0034/src/globals.h 2019-12-22 15:38:02.346438575 +0100 --- src/globals.h 2019-12-23 22:51:49.829957716 +0100 *************** *** 226,232 **** #endif EXTERN int did_emsg_syntax; // did_emsg set because of a // syntax error ! EXTERN int called_emsg; // always set by emsg() 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 rc_did_emsg INIT(= FALSE); // vim_regcomp() called emsg() --- 226,232 ---- #endif EXTERN int did_emsg_syntax; // did_emsg set because of a // syntax error ! EXTERN int called_emsg; // always incremented by emsg() 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 rc_did_emsg INIT(= FALSE); // vim_regcomp() called emsg() *** ../vim-8.2.0034/src/version.c 2019-12-23 18:18:36.616536002 +0100 --- src/version.c 2019-12-23 22:41:35.219975748 +0100 *************** *** 744,745 **** --- 744,747 ---- { /* Add new patch number below this line */ + /**/ + 35, /**/ -- [clop clop] GUARD #1: Halt! Who goes there? ARTHUR: It is I, Arthur, son of Uther Pendragon, from the castle of Camelot. King of the Britons, defeator of the Saxons, sovereign of all England! GUARD #1: Pull the other one! The Quest for the Holy Grail (Monty Python) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///