From 171fb923b8f8da9fb0db1c8c86e35cf4e1339000 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 28 Oct 2020 16:54:47 +0100 Subject: [PATCH] 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 #7213) --- src/testdir/test_vim9_func.vim | 29 +++++++++++++++++++++++++++++ src/version.c | 2 ++ src/vim9execute.c | 8 +++++--- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 9b10c2bda..919af7411 100644 --- 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 index e2a588c44..f1beb91f2 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1916, /**/ 1915, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index 341e5d02a..c428a3d55 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -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; } -- 2.40.0