diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-01-14 21:47:06 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-01-14 21:47:06 +0100 |
commit | 8f81b22e8691f6e7c76153e945bbef15a8190cd9 (patch) | |
tree | e9579341a8ddebe86c5c0d5d83f94ad136ec4bfb | |
parent | 033135eb8eccd00c9ee72c6c0cf4b8b9f81bd269 (diff) | |
download | vim-git-8f81b22e8691f6e7c76153e945bbef15a8190cd9.tar.gz |
patch 8.2.2351: Vim9: error msg for "throw" in function called with "silent!"v8.2.2351
Problem: Vim9: error message for "throw" in function that was called with
"silent!".
Solution: Do not throw the exception when not caught or displayed.
(closes #7672)
-rw-r--r-- | src/testdir/test_vim9_script.vim | 13 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 11 |
3 files changed, 26 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index d567de75f..158c64c27 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -564,6 +564,19 @@ def Test_throw_skipped() endif enddef +def Test_nocatch_throw_silenced() + var lines =<< trim END + vim9script + def Func() + throw 'error' + enddef + silent! Func() + END + writefile(lines, 'XthrowSilenced') + source XthrowSilenced + delete('XthrowSilenced') +enddef + def DeletedFunc(): list<any> return ['delete me'] enddef diff --git a/src/version.c b/src/version.c index 616f4ede8..b2de0115a 100644 --- 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 */ /**/ + 2351, +/**/ 2350, /**/ 2349, diff --git a/src/vim9execute.c b/src/vim9execute.c index 938fc2e19..9c9c27365 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2605,6 +2605,17 @@ call_def_function( break; case ISN_THROW: + if (ectx.ec_trystack.ga_len == 0 && trylevel == 0 + && emsg_silent) + { + // throwing an exception while using "silent!" causes the + // function to abort but not display an error. + tv = STACK_TV_BOT(-1); + clear_tv(tv); + tv->v_type = VAR_NUMBER; + tv->vval.v_number = 0; + goto done; + } --ectx.ec_stack.ga_len; tv = STACK_TV_BOT(0); if (tv->vval.v_string == NULL |