]> granicus.if.org Git - vim/commitdiff
patch 8.2.1916: Vim9: function call is aborted even when "silent!" is used v8.2.1916
authorBram Moolenaar <Bram@vim.org>
Wed, 28 Oct 2020 15:54:47 +0000 (16:54 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 28 Oct 2020 15:54:47 +0000 (16:54 +0100)
Problem:    Vim9: function call is aborted even when "silent!" is used.
Solution:   Use did_emsg instead of called_emsg. (closes #7213)

src/testdir/test_vim9_func.vim
src/version.c
src/vim9execute.c

index 9b10c2bda33403c3232512420fcaa149f3cd5e45..919af741118247fc8a74c2e35206667656d0bbda 100644 (file)
@@ -1462,6 +1462,35 @@ func Test_silent_echo()
   call delete('XTest_silent_echo')
 endfunc
 
+def SilentlyError()
+  execute('silent! invalid')
+  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.
+func Test_ignore_silent_error()
+  let g:did_it = 'no'
+  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)
+
+  unlet g:did_it
+endfunc
+
 def Fibonacci(n: number): number
   if n < 2
     return n
index e2a588c44438e610bc54194ed159f310bebbdd5b..f1beb91f224120a1cfa1a800bdda5c3725eb7791 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1916,
 /**/
     1915,
 /**/
index 341e5d02ac5ffaf574d4e1d8c6c33fd96b8e6027..c428a3d5538130d052d3d7a694ede700588c44a4 100644 (file)
@@ -550,7 +550,7 @@ call_bfunc(int func_idx, int argcount, ectx_T *ectx)
 {
     typval_T   argvars[MAX_FUNC_ARGS];
     int                idx;
-    int                called_emsg_before = called_emsg;
+    int                did_emsg_before = did_emsg;
     ectx_T     *prev_ectx = current_ectx;
 
     if (call_prepare(argcount, argvars, ectx) == FAIL)
@@ -566,7 +566,7 @@ call_bfunc(int func_idx, int argcount, ectx_T *ectx)
     for (idx = 0; idx < argcount; ++idx)
        clear_tv(&argvars[idx]);
 
-    if (called_emsg != called_emsg_before)
+    if (did_emsg != did_emsg_before)
        return FAIL;
     return OK;
 }
@@ -834,6 +834,7 @@ call_def_function(
     msglist_T  *private_msg_list = NULL;
     cmdmod_T   save_cmdmod;
     int                restore_cmdmod = FALSE;
+    int                trylevel_at_start = trylevel;
 
 // Get pointer to item in the stack.
 #define STACK_TV(idx) (((typval_T *)ectx.ec_stack.ga_data) + idx)
@@ -2866,7 +2867,8 @@ func_return:
        continue;
 
 on_error:
-       if (trylevel == 0)
+       // If we are not inside a try-catch started here, abort execution.
+       if (trylevel <= trylevel_at_start)
            goto failed;
     }