From: Bram Moolenaar Date: Wed, 2 Dec 2020 19:51:22 +0000 (+0100) Subject: patch 8.2.2083: Vim9: crash when using ":silent!" and getting member fails X-Git-Tag: v8.2.2083 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=af0df47a7671a39f2cde950587ba48800188bfb9;p=vim 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 #7412) --- diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 554d8902a..86b57f3c1 100644 --- 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 index 0c049905f..0dfe4f064 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 */ +/**/ + 2083, /**/ 2082, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index ab2cf385f..a9fd94e9c 100644 --- 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;