Mercurial > vim
changeset 23074:cd885eb0e50c v8.2.2083
patch 8.2.2083: Vim9: crash when using ":silent!" and getting member fails
Commit: https://github.com/vim/vim/commit/af0df47a7671a39f2cde950587ba48800188bfb9
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 02 Dec 2020 21:00:04 +0100 |
parents | e36f793b3d4c |
children | fc0d222fcf36 |
files | src/testdir/test_vim9_func.vim src/version.c src/vim9execute.c |
diffstat | 3 files changed, 22 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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,
--- 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;