]> granicus.if.org Git - vim/commitdiff
patch 8.2.3078: Vim9: profile test fails v8.2.3078
authorBram Moolenaar <Bram@vim.org>
Wed, 30 Jun 2021 18:39:15 +0000 (20:39 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 30 Jun 2021 18:39:15 +0000 (20:39 +0200)
Problem:    Vim9: profile test fails.
Solution:   Make throw in :catch jump to :finally.

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

index a258bcb7a8a3a4427e2204bf3c84d7e2e8cfe1c3..dfb1a41bb1a4474df5e6b358b4afd3000d6c04da 100644 (file)
@@ -803,6 +803,25 @@ def Test_try_catch_nested()
     endtry
   endtry
   assert_equal(['1', '2', '3', '4', '5', '6'], l)
+
+  l = []
+  try
+    try
+      l->add('1')
+      throw 'foo'
+      l->add('x')
+    catch
+      l->add('2')
+      throw 'bar'
+      l->add('x')
+    finally
+      l->add('3')
+    endtry
+    l->add('x')
+  catch /bar/
+    l->add('4')
+  endtry
+  assert_equal(['1', '2', '3', '4'], l)
 enddef
 
 def TryOne(): number
index 655aaaea33faa999cbeb50cb3d6bec38c904e351..3c626bb6707ff9cf51bb8002b4cdb4cb702f203e 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3078,
 /**/
     3077,
 /**/
index e3e1721f135d217516bc8e32bac15f0a0054b9e6..533c0b33ebd5ad0c74a894c13fa5668373dee54c 100644 (file)
@@ -8397,10 +8397,17 @@ compile_finally(char_u *arg, cctx_T *cctx)
     this_instr = instr->ga_len;
 #ifdef FEAT_PROFILE
     if (cctx->ctx_compile_type == CT_PROFILE
-           && ((isn_T *)instr->ga_data)[instr->ga_len - 1]
+           && ((isn_T *)instr->ga_data)[this_instr - 1]
                                                   .isn_type == ISN_PROF_START)
+    {
        // jump to the profile start of the "finally"
        --this_instr;
+
+       // jump to the profile end above it
+       if (this_instr > 0 && ((isn_T *)instr->ga_data)[this_instr - 1]
+                                                    .isn_type == ISN_PROF_END)
+           --this_instr;
+    }
 #endif
 
     // Fill in the "end" label in jumps at the end of the blocks.
index 4013c06cda2316fca72ca1be1a98efce29c4be8a..b194e6a2a2e56ada5af39713219a86df31ceb998 100644 (file)
@@ -1577,7 +1577,7 @@ exec_instructions(ectx_T *ectx)
            while (index > 0)
            {
                trycmd = ((trycmd_T *)trystack->ga_data) + index - 1;
-               if (!trycmd->tcd_in_catch)
+               if (!trycmd->tcd_in_catch || trycmd->tcd_finally_idx != 0)
                    break;
                // In the catch and finally block of this try we have to go up
                // one level.
@@ -1586,9 +1586,16 @@ exec_instructions(ectx_T *ectx)
            }
            if (trycmd != NULL && trycmd->tcd_frame_idx == ectx->ec_frame_idx)
            {
-               // jump to ":catch" or ":finally"
+               if (trycmd->tcd_in_catch)
+               {
+                   // exception inside ":catch", jump to ":finally" once
+                   ectx->ec_iidx = trycmd->tcd_finally_idx;
+                   trycmd->tcd_finally_idx = 0;
+               }
+               else
+                   // jump to first ":catch"
+                   ectx->ec_iidx = trycmd->tcd_catch_idx;
                trycmd->tcd_in_catch = TRUE;
-               ectx->ec_iidx = trycmd->tcd_catch_idx;
                did_throw = FALSE;  // don't come back here until :endtry
                trycmd->tcd_did_throw = TRUE;
            }