]> granicus.if.org Git - vim/commitdiff
patch 8.2.0287: Vim9: return in try block not tested; catch not tested v8.2.0287
authorBram Moolenaar <Bram@vim.org>
Thu, 20 Feb 2020 19:41:06 +0000 (20:41 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 20 Feb 2020 19:41:06 +0000 (20:41 +0100)
Problem:    Vim9: return in try block not tested; catch with pattern not
            tested.
Solution:   Add tests.  Make it work.

src/testdir/test_vim9_script.vim
src/version.c
src/vim9execute.c

index ac721a80c6211835a3a791e2513d9a29078e4207..3212c3de20b0f9b4136a867497dbc9455d1ffc6f 100644 (file)
@@ -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
index e17c98b23207235dcfe787648a373cfd264c6a40..4be1aa357b4371270dffda1cfe327cc3e04882e8 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    287,
 /**/
     286,
 /**/
index 6fad391d1f281525f2218087bdb04536664b01d6..7be8cdb92659bddfc29cecabf32ca817ed51d9c6 100644 (file)
@@ -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)