# HG changeset patch # User Bram Moolenaar # Date 1606939204 -3600 # Node ID cd885eb0e50c4a0208f3cd5bcb6611037057fc4d # Parent e36f793b3d4c2b99121ffad6469586676cfe673b patch 8.2.2083: Vim9: crash when using ":silent!" and getting member fails Commit: https://github.com/vim/vim/commit/af0df47a7671a39f2cde950587ba48800188bfb9 Author: Bram Moolenaar Date: Wed Dec 2 20:51:22 2020 +0100 patch 8.2.2083: Vim9: crash when using ":silent!" and getting member fails Problem: Vim9: crash when using ":silent!" and getting member fails. Solution: Jump to on_fatal_error. (closes https://github.com/vim/vim/issues/7412) 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 @@ -1768,5 +1768,19 @@ def Test_reset_did_emsg() CheckScriptFailure(lines, 'E492:', 8) enddef +def Test_abort_even_with_silent() + var lines =<< trim END + vim9script + g:result = 'none' + def Func() + eval {-> ''}() .. '' .. {}['X'] + g:result = 'yes' + enddef + sil! Func() + assert_equal('none', g:result) + END + CheckScriptSuccess(lines) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 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 */ /**/ + 2083, +/**/ 2082, /**/ 2081, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2669,12 +2669,12 @@ call_def_function( { SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_dictkey), key); - goto on_error; + goto on_fatal_error; } clear_tv(tv); --ectx.ec_stack.ga_len; - // Clear the dict after getting the item, to avoid that it - // make the item invalid. + // Clear the dict only after getting the item, to avoid + // that it makes the item invalid. tv = STACK_TV_BOT(-1); temp_tv = *tv; copy_tv(&di->di_tv, tv); @@ -2997,10 +2997,12 @@ func_return: continue; on_error: + // Jump here for an error that does not require aborting execution. // If "emsg_silent" is set then ignore the error. if (did_emsg_cumul + did_emsg == did_emsg_before && emsg_silent) continue; - +on_fatal_error: + // Jump here for an error that messes up the stack. // If we are not inside a try-catch started here, abort execution. if (trylevel <= trylevel_at_start) goto failed;