# HG changeset patch # User Bram Moolenaar # Date 1603900803 -3600 # Node ID 56907027dba7a4fbfc648a209df12c18bad87d75 # Parent 6a0c4559c941920495db7a39a93a475e0fd7e0f7 patch 8.2.1916: Vim9: function call is aborted even when "silent!" is used Commit: https://github.com/vim/vim/commit/171fb923b8f8da9fb0db1c8c86e35cf4e1339000 Author: Bram Moolenaar Date: Wed Oct 28 16:54:47 2020 +0100 patch 8.2.1916: Vim9: function call is aborted even when "silent!" is used Problem: Vim9: function call is aborted even when "silent!" is used. Solution: Use did_emsg instead of called_emsg. (closes https://github.com/vim/vim/issues/7213) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1916, +/**/ 1915, /**/ 1914, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -550,7 +550,7 @@ call_bfunc(int func_idx, int argcount, e { 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, e 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; }