Commit: patch 9.1.0529: silent! causes following try/catch to not work

5 views
Skip to first unread message

Christian Brabandt

unread,
Jul 4, 2024, 1:45:10 PM7/4/24
to vim...@googlegroups.com
patch 9.1.0529: silent! causes following try/catch to not work

Commit: https://github.com/vim/vim/commit/749ba0f6d922b3f6b54a66543c214479492b5a0e
Author: LemonBoy <that...@gmail.com>
Date: Thu Jul 4 19:23:16 2024 +0200

patch 9.1.0529: silent! causes following try/catch to not work

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 <that...@gmail.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index c37a1d4bd..5b15a46b8 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 71bfa9322..59d3db4dd 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 897677957..21f894e9a 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 07720befc..b7812fa00 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 529,
/**/
528,
/**/
Reply all
Reply to author
Forward
0 new messages