summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-01-14 21:47:06 +0100
committerBram Moolenaar <Bram@vim.org>2021-01-14 21:47:06 +0100
commit8f81b22e8691f6e7c76153e945bbef15a8190cd9 (patch)
treee9579341a8ddebe86c5c0d5d83f94ad136ec4bfb
parent033135eb8eccd00c9ee72c6c0cf4b8b9f81bd269 (diff)
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.vim13
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c11
3 files changed, 26 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index d567de75f8..158c64c27c 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 616f4ede85..b2de0115a2 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 938fc2e191..9c9c273650 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