]> granicus.if.org Git - vim/commitdiff
patch 8.2.1919: assert_fails() setting emsg_silent changes normal execution v8.2.1919
authorBram Moolenaar <Bram@vim.org>
Wed, 28 Oct 2020 19:20:00 +0000 (20:20 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 28 Oct 2020 19:20:00 +0000 (20:20 +0100)
Problem:    Assert_fails() setting emsg_silent changes normal execution.
Solution:   Use a separate flag in_assert_fails.

19 files changed:
src/buffer.c
src/change.c
src/fileio.c
src/globals.h
src/insexpand.c
src/message.c
src/misc1.c
src/normal.c
src/screen.c
src/term.c
src/testdir/gen_opt_test.vim
src/testdir/test_autocmd.vim
src/testdir/test_mapping.vim
src/testdir/test_popup.vim
src/testdir/test_terminal.vim
src/testdir/test_vim9_func.vim
src/testing.c
src/version.c
src/vim9execute.c

index 5cbaaac9cc5e48811e875b02ad8d875871449561..c804348e19c3e5b2b7181d50e7ca2008778aacfb 100644 (file)
@@ -2154,7 +2154,7 @@ buflist_new(
        if (top_file_num < 0)           // wrap around (may cause duplicates)
        {
            emsg(_("W14: Warning: List of file names overflow"));
-           if (emsg_silent == 0)
+           if (emsg_silent == 0 && !in_assert_fails)
            {
                out_flush();
                ui_delay(3001L, TRUE);  // make sure it is noticed
index 45780573dce3e600cb0292ff8b84ed1999c74bec..50dc105436a775068267503b5c5f2c7daf037e5d 100644 (file)
@@ -115,7 +115,7 @@ changed(void)
            // Wait two seconds, to make sure the user reads this unexpected
            // message.  Since we could be anywhere, call wait_return() now,
            // and don't let the emsg() set msg_scroll.
-           if (need_wait_return && emsg_silent == 0)
+           if (need_wait_return && emsg_silent == 0 && !in_assert_fails)
            {
                out_flush();
                ui_delay(2002L, TRUE);
index 9eecb0108d4316877ecad1276af1e7aaae1c02ec..27e9aaecf28b062ae4578f23ba9191fac7714d56 100644 (file)
@@ -4208,7 +4208,7 @@ buf_check_timestamp(
                        msg_puts_attr(mesg2, HL_ATTR(HLF_W) + MSG_HIST);
                    msg_clr_eos();
                    (void)msg_end();
-                   if (emsg_silent == 0)
+                   if (emsg_silent == 0 && !in_assert_fails)
                    {
                        out_flush();
 #ifdef FEAT_GUI
index 5495eac13b04debc9a3ef3f1d7f384ceb2ddb7fa..5bdbad636fb1e2a910f88a54f633bdfa47ff1cc1 100644 (file)
@@ -221,7 +221,6 @@ EXTERN int  emsg_skip INIT(= 0);        // don't display errors for
 EXTERN int     emsg_severe INIT(= FALSE);  // use message of next of several
                                            // emsg() calls for throw
 // used by assert_fails()
-EXTERN int     emsg_assert_fails_used INIT(= FALSE);
 EXTERN char_u  *emsg_assert_fails_msg INIT(= NULL);
 EXTERN long    emsg_assert_fails_lnum INIT(= 0);
 EXTERN char_u  *emsg_assert_fails_context INIT(= NULL);
@@ -1130,6 +1129,8 @@ EXTERN int        emsg_silent INIT(= 0);  // don't print error messages
 EXTERN int     emsg_noredir INIT(= 0); // don't redirect error messages
 EXTERN int     cmd_silent INIT(= FALSE); // don't echo the command line
 
+EXTERN int     in_assert_fails INIT(= FALSE);  // assert_fails() active
+
 EXTERN int     swap_exists_action INIT(= SEA_NONE);
                                        // For dialog when swap file already
                                        // exists.
index 87aaf7d6bcd6e2cd20509bfe21f535801af712f5..7e61e618becb7e19fc92d9b98b2a8fc40a465f0b 100644 (file)
@@ -298,7 +298,7 @@ has_compl_option(int dict_opt)
        msg_attr(dict_opt ? _("'dictionary' option is empty")
                          : _("'thesaurus' option is empty"),
                                                              HL_ATTR(HLF_E));
-       if (emsg_silent == 0)
+       if (emsg_silent == 0 && !in_assert_fails)
        {
            vim_beep(BO_COMPL);
            setcursor();
index 8c8e954d50b0688563e5dd11943612d14782a9cc..f8efabc80d6388e42bcc6343486816398b84b6fd 100644 (file)
@@ -659,7 +659,7 @@ emsg_core(char_u *s)
            return TRUE;
        }
 
-       if (emsg_assert_fails_used && emsg_assert_fails_msg == NULL)
+       if (in_assert_fails && emsg_assert_fails_msg == NULL)
        {
            emsg_assert_fails_msg = vim_strsave(s);
            emsg_assert_fails_lnum = SOURCING_LNUM;
index 058e8602db41c8c6ab2ee98ee3c737e3ef2506b3..010622ee5ccd589769fa21294c84784d6160680f 100644 (file)
@@ -1063,7 +1063,7 @@ vim_beep(
     called_vim_beep = TRUE;
 #endif
 
-    if (emsg_silent == 0)
+    if (emsg_silent == 0 && !in_assert_fails)
     {
        if (!((bo_flags & val) || (bo_flags & BO_ALL)))
        {
@@ -2568,6 +2568,7 @@ goto_im(void)
  * But don't allow a space in the path, so that this works:
  *   "/usr/bin/csh --rcfile ~/.cshrc"
  * But don't do that for Windows, it's common to have a space in the path.
+ * Returns NULL when out of memory.
  */
     char_u *
 get_isolated_shell_name(void)
index 89eaabccc1a62208fce7f0cefd078a2279fa2bad..af4d3b2885459b40a0fa39f13403e44cd1604249 100644 (file)
@@ -1154,6 +1154,7 @@ getcount:
            && stuff_empty()
            && typebuf_typed()
            && emsg_silent == 0
+           && !in_assert_fails
            && !did_wait_return
            && oap->op_type == OP_NOP)
     {
index 0b117cd849faec5c6c51e81796dd63412a9d9132..6e907cdf41b71ea9ad062a9d0bc7637c930ce609 100644 (file)
@@ -2490,7 +2490,8 @@ check_for_delay(int check_msg_scroll)
 {
     if ((emsg_on_display || (check_msg_scroll && msg_scroll))
            && !did_wait_return
-           && emsg_silent == 0)
+           && emsg_silent == 0
+           && !in_assert_fails)
     {
        out_flush();
        ui_delay(1006L, TRUE);
index be6d531b97191f61e261e62c1f7e461996fc6d48..4d4cc589d9e169655418d05b29bbcab9d0448e40 100644 (file)
@@ -1800,7 +1800,7 @@ report_default_term(char_u *term)
     mch_errmsg(_("defaulting to '"));
     mch_errmsg((char *)term);
     mch_errmsg("'\r\n");
-    if (emsg_silent == 0)
+    if (emsg_silent == 0 && !in_assert_fails)
     {
        screen_start(); // don't know where cursor is now
        out_flush();
index 271abedce36e7b9831d1e845f50469df5179fc4d..600a7908068184eff809eb66bd81dc240a83de4c 100644 (file)
@@ -200,8 +200,8 @@ while 1
       " setting an option can only fail when it's implemented.
       call add(script, "if exists('+" . name . "')")
       for val in a[1]
-       call add(script, "call assert_fails('set " . name . "=" . val . "')")
-       call add(script, "call assert_fails('set " . shortname . "=" . val . "')")
+       call add(script, "silent! call assert_fails('set " . name . "=" . val . "')")
+       call add(script, "silent! call assert_fails('set " . shortname . "=" . val . "')")
       endfor
       call add(script, "endif")
     endif
index 639f9eb675af8ec2a3acbf7923905d2aae58e328..1e8711c6b13fee62f34429aad04ab86f735c0bc7 100644 (file)
@@ -194,7 +194,7 @@ func Test_autocmd_bufunload_avoiding_SEGV_01()
     exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
   augroup END
 
-  call assert_fails('edit bb.txt', ['E937:', 'E517:'])
+  call assert_fails('edit bb.txt', 'E937:')
 
   autocmd! test_autocmd_bufunload
   augroup! test_autocmd_bufunload
@@ -1768,7 +1768,7 @@ endfunc
 func Test_nocatch_wipe_all_buffers()
   " Real nasty autocommand: wipe all buffers on any event.
   au * * bwipe *
-  call assert_fails('next x', ['E94:', 'E517:'])
+  call assert_fails('next x', ['E94:', 'E937:'])
   bwipe
   au!
 endfunc
index 67a908a5afec540fde9e6fa2745f67667f22c74f..5bec95a11c40b35e7a9af8dbf3bf5c81c2c9a8cd 100644 (file)
@@ -681,7 +681,7 @@ func Test_expr_abbr()
   " invalid <expr> abbreviation
   abbr <expr> hte GetAbbr()
   call assert_fails('normal ihte ', 'E117:')
-  call assert_equal(' ', getline(1))
+  call assert_equal('', getline(1))
   unabbr <expr> hte
 
   close!
index 381a2c19b447871f7c62a9bac0aeae7ae3164972..28481b3a2865de434bfde4d298b44b4e323884e7 100644 (file)
@@ -344,7 +344,7 @@ func Test_completefunc_opens_new_window_one()
   /^one
   call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")', 'E578:')
   call assert_equal(winid, win_getid())
-  call assert_equal('oneDEF', getline(1))
+  call assert_equal('onedef', getline(1))
   q!
 endfunc
 
index 676d864c72d840be4e27dbd36c956c00b87e14b6..829706c93be50a74fa8d0914133c494efa98154d 100644 (file)
@@ -65,7 +65,7 @@ func Test_terminal_make_change()
 
   setlocal modifiable
   exe "normal Axxx\<Esc>"
-  call assert_fails(buf . 'bwipe', ['E89:', 'E517:'])
+  call assert_fails(buf . 'bwipe', 'E89:')
   undo
 
   exe buf . 'bwipe'
@@ -89,7 +89,7 @@ endfunc
 
 func Test_terminal_wipe_buffer()
   let buf = Run_shell_in_terminal({})
-  call assert_fails(buf . 'bwipe', ['E89:', 'E517:'])
+  call assert_fails(buf . 'bwipe', 'E89:')
   exe buf . 'bwipe!'
   call WaitForAssert({-> assert_equal('dead', job_status(g:job))})
   call assert_equal("", bufname(buf))
@@ -648,7 +648,7 @@ endfunc
 
 func Test_terminal_list_args()
   let buf = term_start([&shell, &shellcmdflag, 'echo "123"'])
-  call assert_fails(buf . 'bwipe', ['E89:', 'E517:'])
+  call assert_fails(buf . 'bwipe', 'E89:')
   exe buf . 'bwipe!'
   call assert_equal("", bufname(buf))
 endfunction
index 919af741118247fc8a74c2e35206667656d0bbda..4ec0f6fdbcf085829d90948a53948d63909d9c92 100644 (file)
@@ -1467,14 +1467,14 @@ def SilentlyError()
   g:did_it = 'yes'
 enddef
 
-"func UserError()
-"  silent! invalid
-"endfunc
-"
-"def SilentlyUserError()
-"  UserError()
-"  g:did_it = 'yes'
-"enddef
+func UserError()
+  silent! invalid
+endfunc
+
+def SilentlyUserError()
+  UserError()
+  g:did_it = 'yes'
+enddef
 
 " This can't be a :def function, because the assert would not be reached.
 " And this must not be inside a try/endtry.
@@ -1483,10 +1483,9 @@ func Test_ignore_silent_error()
   call SilentlyError()
   call assert_equal('yes', g:did_it)
 
-"  this doesn't work yet
-"  let g:did_it = 'no'
-"  call SilentlyUserError()
-"  call assert_equal('yes', g:did_it)
+  let g:did_it = 'no'
+  call SilentlyUserError()
+  call assert_equal('yes', g:did_it)
 
   unlet g:did_it
 endfunc
index 8115441033bf9a38a7b4f0ace5faa87a1e2a0f96..919b91182b8d4c64a22e28c3c36cc01f737ba346 100644 (file)
@@ -555,8 +555,7 @@ f_assert_fails(typval_T *argvars, typval_T *rettv)
     // trylevel must be zero for a ":throw" command to be considered failed
     trylevel = 0;
     suppress_errthrow = TRUE;
-    emsg_silent = TRUE;
-    emsg_assert_fails_used = TRUE;
+    in_assert_fails = TRUE;
 
     do_cmdline_cmd(cmd);
     if (called_emsg == called_emsg_before)
@@ -679,9 +678,13 @@ f_assert_fails(typval_T *argvars, typval_T *rettv)
 theend:
     trylevel = save_trylevel;
     suppress_errthrow = FALSE;
-    emsg_silent = FALSE;
+    in_assert_fails = FALSE;
+    did_emsg = FALSE;
+    msg_col = 0;
+    need_wait_return = FALSE;
     emsg_on_display = FALSE;
-    emsg_assert_fails_used = FALSE;
+    msg_scrolled = 0;
+    lines_left = Rows;
     VIM_CLEAR(emsg_assert_fails_msg);
     set_vim_var_string(VV_ERRMSG, NULL, 0);
     if (wrong_arg_msg != NULL)
index a7508cae93e8d5746fe93d0dd5924b3d090a9bc8..2aa5b0d948af16636d9aa3eed60bcc0e33036868 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1919,
 /**/
     1918,
 /**/
index c428a3d5538130d052d3d7a694ede700588c44a4..09eb6c2210ebf515e599d11d72fe1f7cdee3808a 100644 (file)
@@ -582,7 +582,7 @@ call_ufunc(ufunc_T *ufunc, int argcount, ectx_T *ectx, isn_T *iptr)
     funcexe_T   funcexe;
     int                error;
     int                idx;
-    int                called_emsg_before = called_emsg;
+    int                did_emsg_before = did_emsg;
 
     if (ufunc->uf_def_status == UF_TO_BE_COMPILED
            && compile_def_function(ufunc, FALSE, NULL) == FAIL)
@@ -620,7 +620,7 @@ call_ufunc(ufunc_T *ufunc, int argcount, ectx_T *ectx, isn_T *iptr)
        user_func_error(error, ufunc->uf_name);
        return FAIL;
     }
-    if (called_emsg > called_emsg_before)
+    if (did_emsg > did_emsg_before)
        // Error other than from calling the function itself.
        return FAIL;
     return OK;