summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2024-07-04 19:23:16 +0200
committerChristian Brabandt <cb@256bit.org>2024-07-04 19:23:16 +0200
commit749ba0f6d922b3f6b54a66543c214479492b5a0e (patch)
tree52cb115b2cc1a254306bf14e64cc20784a6b1fab
parent11d599257310bb95a7d1a3537345ae26f36c6210 (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.txt6
-rw-r--r--src/ex_docmd.c9
-rw-r--r--src/testdir/test_vimscript.vim25
-rw-r--r--src/version.c2
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,