diff options
author | LemonBoy <thatlemon@gmail.com> | 2024-07-04 19:23:16 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2024-07-04 19:23:16 +0200 |
commit | 749ba0f6d922b3f6b54a66543c214479492b5a0e (patch) | |
tree | 52cb115b2cc1a254306bf14e64cc20784a6b1fab | |
parent | 11d599257310bb95a7d1a3537345ae26f36c6210 (diff) |
patch 9.1.0529: silent! causes following try/catch to not workv9.1.0529
Problem: silent! causes following try/catch to not work
(Malcolm Rowe)
Solution: consider emsg_silent in handle_did_throw() and do not abort
evaluation flow for :silent! (LemonBoy)
The silent! flag causes the evaluation not to be aborted in case of
uncaught exceptions, adjust handle_did_throw to take this detail into
account.
Fixes the long-standing todo.txt item:
```
Problem that a previous silent ":throw" causes a following try/catch not
to work. (ZyX, 2013 Sep 28) With examples: (Malcolm Rowe, 2015 Dec 24)
Also see #8487 for an example.
```
fixes: #538
closes: #15128
Signed-off-by: LemonBoy <thatlemon@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | runtime/doc/todo.txt | 6 | ||||
-rw-r--r-- | src/ex_docmd.c | 9 | ||||
-rw-r--r-- | src/testdir/test_vimscript.vim | 25 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 35 insertions, 7 deletions
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index c37a1d4bd1..5b15a46b8c 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 9.1. Last change: 2024 Jun 03 +*todo.txt* For Vim version 9.1. Last change: 2024 Jul 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -512,10 +512,6 @@ Information for a specific terminal (e.g. gnome, tmux, konsole, alacritty) is spread out. Make a section with copy/paste examples of script and pointers to more information. -Problem that a previous silent ":throw" causes a following try/catch not to -work. (ZyX, 2013 Sep 28) With examples: (Malcolm Rowe, 2015 Dec 24) -Also see #8487 for an example. - Request to use "." for the cursor column in search pattern \%<.c and \%<.v. (#8179) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 71bfa93222..59d3db4dd1 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -1460,8 +1460,13 @@ handle_did_throw(void) current_exception->throw_name = NULL; discard_current_exception(); // uses IObuff if 'verbose' - suppress_errthrow = TRUE; - force_abort = TRUE; + + // If "silent!" is active the uncaught exception is not fatal. + if (emsg_silent == 0) + { + suppress_errthrow = TRUE; + force_abort = TRUE; + } if (messages != NULL) { diff --git a/src/testdir/test_vimscript.vim b/src/testdir/test_vimscript.vim index 897677957a..21f894e9a3 100644 --- a/src/testdir/test_vimscript.vim +++ b/src/testdir/test_vimscript.vim @@ -7536,6 +7536,31 @@ func Test_deeply_nested_source() call system(cmd) endfunc +func Test_exception_silent() + XpathINIT + let lines =<< trim END + func Throw() + Xpath 'a' + throw "Uncaught" + " This line is not executed. + Xpath 'b' + endfunc + " The exception is suppressed due to the presence of silent!. + silent! call Throw() + try + call DoesNotExist() + catch /E117:/ + Xpath 'c' + endtry + Xpath 'd' + END + let verify =<< trim END + call assert_equal('acd', g:Xpath) + END + + call RunInNewVim(lines, verify) +endfunc + "------------------------------------------------------------------------------- " Modelines {{{1 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index 07720befc5..b7812fa009 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 529, +/**/ 528, /**/ 527, |