]> granicus.if.org Git - vim/commitdiff
patch 8.2.0035: saving and restoring called_emsg is clumsy v8.2.0035
authorBram Moolenaar <Bram@vim.org>
Mon, 23 Dec 2019 21:59:18 +0000 (22:59 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 23 Dec 2019 21:59:18 +0000 (22:59 +0100)
Problem:    Saving and restoring called_emsg is clumsy.
Solution:   Count the number of error messages.

13 files changed:
src/buffer.c
src/channel.c
src/drawscreen.c
src/ex_cmds2.c
src/globals.h
src/gui.c
src/highlight.c
src/main.c
src/message.c
src/regexp.c
src/search.c
src/testing.c
src/version.c

index da10579cccbf202d2b0efc0dc24ee77b0e4c99d8..740d31b91b000190c511bd4b22ce68100bfa5969 100644 (file)
@@ -3746,19 +3746,17 @@ maketitle(void)
            if (stl_syntax & STL_IN_TITLE)
            {
                int     use_sandbox = FALSE;
-               int     save_called_emsg = called_emsg;
+               int     called_emsg_before = 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)
+               if (called_emsg > called_emsg_before)
                    set_string_option_direct((char_u *)"titlestring", -1,
                                           (char_u *)"", OPT_FREE, SID_ERROR);
-               called_emsg |= save_called_emsg;
            }
            else
 #endif
@@ -3879,19 +3877,17 @@ maketitle(void)
            if (stl_syntax & STL_IN_ICON)
            {
                int     use_sandbox = FALSE;
-               int     save_called_emsg = called_emsg;
+               int     called_emsg_before = 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)
+               if (called_emsg > called_emsg_before)
                    set_string_option_direct((char_u *)"iconstring", -1,
                                           (char_u *)"", OPT_FREE, SID_ERROR);
-               called_emsg |= save_called_emsg;
            }
            else
 #endif
index ebbc315cc7206604c131e6575a25e902566ffce4..fc6a7a37bb46e6f12b28b74f5f519f1bc2474191 100644 (file)
@@ -2370,17 +2370,15 @@ channel_exe_cmd(channel_T *channel, ch_part_T part, typval_T *argv)
 
     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);
        ++emsg_silent;
        do_cmdline_cmd(arg);
        --emsg_silent;
-       if (called_emsg)
+       if (called_emsg > called_emsg_before)
            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)
     {
index 3a88ee979477a15a40c03cf30d10e0ba8c1861ae..6b755c8c9b52272744c77bcc872629c496a9027b 100644 (file)
@@ -650,14 +650,12 @@ win_redr_ruler(win_T *wp, int always, int ignore_pum)
 #ifdef FEAT_STL_OPT
     if (*p_ruf)
     {
-       int     save_called_emsg = called_emsg;
+       int     called_emsg_before = called_emsg;
 
-       called_emsg = FALSE;
        win_redr_custom(wp, TRUE);
-       if (called_emsg)
+       if (called_emsg > called_emsg_before)
            set_string_option_direct((char_u *)"rulerformat", -1,
                                           (char_u *)"", OPT_FREE, SID_ERROR);
-       called_emsg |= save_called_emsg;
        return;
     }
 #endif
index 9a31887abd5853dd897105d90c2b006ef0e154a9..4f8f7fbf658083d7a20850a802ed6cdd2085bc6f 100644 (file)
@@ -167,7 +167,7 @@ check_due_timer(void)
            // the current scope, such as being inside a try/catch.
            timer_busy = timer_busy > 0 || vgetc_busy > 0;
            vgetc_busy = 0;
-           called_emsg = FALSE;
+           called_emsg = 0;
            did_emsg = FALSE;
            did_uncaught_emsg = FALSE;
            must_redraw = 0;
index 9ddb164413816c559e5baae2c2ca89190c2431c1..33082d514b898a6bb4a948cdbd813e026561407a 100644 (file)
@@ -226,7 +226,7 @@ EXTERN int  did_uncaught_emsg;          // emsg() was called and did not
 #endif
 EXTERN int     did_emsg_syntax;            // did_emsg set because of a
                                            // 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     emsg_on_display INIT(= FALSE);  // there is an error message
 EXTERN int     rc_did_emsg INIT(= FALSE);  // vim_regcomp() called emsg()
index 8fd311474361da5cb2c49d538e2ad5ebc6c839f3..7b59300586e88c0efbb84bffdb5916c713758f22 100644 (file)
--- a/src/gui.c
+++ b/src/gui.c
@@ -3704,14 +3704,12 @@ get_tabline_label(
     if (**opt != NUL)
     {
        int     use_sandbox = FALSE;
-       int     save_called_emsg = called_emsg;
+       int     called_emsg_before = 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);
@@ -3742,10 +3740,9 @@ get_tabline_label(
        curwin = curtab->tp_curwin;
        curbuf = curwin->w_buffer;
 
-       if (called_emsg)
+       if (called_emsg > called_emsg_before)
            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
index da2bdc6511f6e8bd972936540afec0c332f7ea5e..564cf3a23a243ca7aae7b8f29acc4415bd347cf8 100644 (file)
@@ -4055,7 +4055,7 @@ next_search_hl(
     linenr_T   l;
     colnr_T    matchcol;
     long       nmatched;
-    int                save_called_emsg = called_emsg;
+    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,7 +4081,6 @@ next_search_hl(
      * 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
@@ -4143,7 +4142,7 @@ next_search_hl(
            if (regprog_is_copy)
                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.
                if (shl == search_hl)
@@ -4176,9 +4175,6 @@ next_search_hl(
            break;                      // useful match found
        }
     }
-
-    // Restore called_emsg for assert_fails().
-    called_emsg = save_called_emsg;
 }
 
 /*
index 72e51a310b893a3d9d4ec31d008adc2c9d2478a5..eec02ea85bd38650b7ac7f0d4bd3053ef073db10 100644 (file)
@@ -4140,7 +4140,7 @@ cmdsrv_main(
            if (xterm_dpy != NULL)
                res = serverGetVimNames(xterm_dpy);
 # endif
-           if (called_emsg)
+           if (did_emsg)
                mch_errmsg("\n");
        }
        else if (STRICMP(argv[i], "--servername") == 0)
index 522f7d69c34f18db55aa6963562bde9c81ad2ed9..2ea939f193f8009937aa49d65aa9926b9d628845 100644 (file)
@@ -581,7 +581,7 @@ ignore_error(char_u *msg)
 #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.
+ * v:errmsg will be set and called_emsg will be incremented.
  */
     void
 do_perror(char *msg)
@@ -620,7 +620,7 @@ emsg_core(char_u *s)
        return msg_use_printf() ? FALSE : msg((char *)s);
 #endif
 
-    called_emsg = TRUE;
+    ++called_emsg;
 
 #ifdef FEAT_EVAL
     // If "emsg_severe" is TRUE: When an error exception is to be thrown,
index 112f75369edef2573d90b7906d0fd5b162e27ad9..ef3896c0a4d7a97ae35bfd29454196345da617d4 100644 (file)
@@ -2556,7 +2556,7 @@ vim_regcomp(char_u *expr_arg, int re_flags)
 {
     regprog_T   *prog = NULL;
     char_u     *expr = expr_arg;
-    int                save_called_emsg;
+    int                called_emsg_before;
 
     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.
      */
-    save_called_emsg = called_emsg;
-    called_emsg = FALSE;
+    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,13 +2623,13 @@ vim_regcomp(char_u *expr_arg, int re_flags)
         * 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)
+       if (regexp_engine == AUTOMATIC_ENGINE
+                                         && called_emsg == called_emsg_before)
        {
            regexp_engine = BACKTRACKING_ENGINE;
            prog = bt_regengine.regcomp(expr, re_flags);
        }
     }
-    called_emsg |= save_called_emsg;
 
     if (prog != NULL)
     {
index 1a5dc1a428746f950227ef06474ff4fe3806c856..3b310dc2a96b097e9ffc64e0964a0835dad4a9d6 100644 (file)
@@ -624,7 +624,7 @@ searchit(
     long       nmatched;
     int                submatch = 0;
     int                first_match = TRUE;
-    int                save_called_emsg = called_emsg;
+    int                called_emsg_before = called_emsg;
 #ifdef FEAT_SEARCH_EXTRA
     int                break_loop = FALSE;
 #endif
@@ -654,7 +654,6 @@ searchit(
     /*
      * find the string
      */
-    called_emsg = FALSE;
     do // loop for count
     {
        // When not accepting a match at the start position set "extra_col" to
@@ -745,7 +744,7 @@ searchit(
 #endif
                                                      );
                // Abort searching on an error (e.g., out of stack).
-               if (called_emsg
+               if (called_emsg > called_emsg_before
 #ifdef FEAT_RELTIME
                        || (timed_out != NULL && *timed_out)
 #endif
@@ -1055,7 +1054,8 @@ searchit(
             * specified, after an interrupt, after a match and after looping
             * 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
                                || (timed_out != NULL && *timed_out)
 #endif
@@ -1082,7 +1082,7 @@ searchit(
            if (extra_arg != NULL)
                extra_arg->sa_wrapped = TRUE;
        }
-       if (got_int || called_emsg
+       if (got_int || called_emsg > called_emsg_before
 #ifdef FEAT_RELTIME
                || (timed_out != NULL && *timed_out)
 #endif
@@ -1096,8 +1096,6 @@ searchit(
 
     vim_regfree(regmatch.regprog);
 
-    called_emsg |= save_called_emsg;
-
     if (!found)                    // did not find it
     {
        if (got_int)
@@ -4799,7 +4797,7 @@ is_zero_width(char_u *pattern, int move, pos_T *cur, int direction)
     int                nmatched = 0;
     int                result = -1;
     pos_T      pos;
-    int                save_called_emsg = called_emsg;
+    int                called_emsg_before = called_emsg;
     int                flag = 0;
 
     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
        // start and end are in the same position.
-       called_emsg = FALSE;
        do
        {
            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
                                      : regmatch.startpos[0].col > pos.col);
 
-       if (!called_emsg)
+       if (called_emsg == called_emsg_before)
        {
            result = (nmatched != 0
                && 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);
     return result;
 }
index f879f1ea9c71f4fae59892503b8662fcc968157a..569a57c8e8b2a6329c764c88d16c6486b8d99b13 100644 (file)
@@ -424,15 +424,15 @@ f_assert_fails(typval_T *argvars, typval_T *rettv)
     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;
-    called_emsg = FALSE;
     suppress_errthrow = TRUE;
     emsg_silent = TRUE;
 
     do_cmdline_cmd(cmd);
-    if (!called_emsg)
+    if (called_emsg == called_emsg_before)
     {
        prepare_assert_error(&ga);
        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;
-    called_emsg = FALSE;
     suppress_errthrow = FALSE;
     emsg_silent = FALSE;
     emsg_on_display = FALSE;
index 9f369a95d80666b3f22deda083ce619ca9c0d92a..b1f40d4a22cfdce34f5ab9485b8c228f2177815a 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    35,
 /**/
     34,
 /**/