changeset 19459:423b27246383 v8.2.0287

patch 8.2.0287: Vim9: return in try block not tested; catch not tested Commit: https://github.com/vim/vim/commit/f575adff06d4bc5f670939567ce86974683deb7a Author: Bram Moolenaar <Bram@vim.org> Date: Thu Feb 20 20:41:06 2020 +0100 patch 8.2.0287: Vim9: return in try block not tested; catch not tested Problem: Vim9: return in try block not tested; catch with pattern not tested. Solution: Add tests. Make it work.
author Bram Moolenaar <Bram@vim.org>
date Thu, 20 Feb 2020 20:45:03 +0100
parents a9a0354cf324
children 5a60f7d281e8
files src/testdir/test_vim9_script.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 32 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -236,12 +236,40 @@ def CatchInDef()
   endtry
 enddef
 
+def ReturnFinally(): string
+  try
+    return 'intry'
+  finally
+    g:in_finally = 'finally'
+  endtry
+  return 'end'
+enddef
+
 def Test_try_catch_nested()
   CatchInFunc()
   assert_equal('getout', g:thrown_func)
 
   CatchInDef()
   assert_equal('getout', g:thrown_def)
+
+  assert_equal('intry', ReturnFinally())
+  assert_equal('finally', g:in_finally)
+enddef
+
+def Test_try_catch_match()
+  let seq = 'a'
+  try
+    throw 'something'
+  catch /nothing/
+    seq ..= 'x'
+  catch /some/
+    seq ..= 'b'
+  catch /asdf/
+    seq ..= 'x'
+  finally
+    seq ..= 'c'
+  endtry
+  assert_equal('abc', seq)
 enddef
 
 let s:export_script_lines =<< trim END
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    287,
+/**/
     286,
 /**/
     285,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1065,6 +1065,7 @@ call_def_function(
 		    trycmd->tcd_frame = ectx.ec_frame;
 		    trycmd->tcd_catch_idx = iptr->isn_arg.try.try_catch;
 		    trycmd->tcd_finally_idx = iptr->isn_arg.try.try_finally;
+		    trycmd->tcd_caught = FALSE;
 		}
 		break;
 
@@ -1109,7 +1110,7 @@ call_def_function(
 			--trylevel;
 			trycmd = ((trycmd_T *)trystack->ga_data)
 							    + trystack->ga_len;
-			if (trycmd->tcd_caught)
+			if (trycmd->tcd_caught && current_exception != NULL)
 			{
 			    // discard the exception
 			    if (caught_stack == current_exception)