Patch 8.2.3366
Problem:    Vim9: debugging elseif does not stop before condition.
Solution:   Move debug statement to after the jump. (closes #8781)
Files:      src/vim9compile.c, src/testdir/test_vim9_disassemble.vim


*** ../vim-8.2.3365/src/vim9compile.c   2021-08-21 20:50:31.206336775 +0200
--- src/vim9compile.c   2021-08-22 13:12:08.007746456 +0200
***************
*** 2387,2393 ****
  
  /*
   * Get the index of the current instruction.
!  * This compenstates for a preceding ISN_CMDMOD and ISN_PROF_START.
   */
      static int
  current_instr_idx(cctx_T *cctx)
--- 2387,2393 ----
  
  /*
   * Get the index of the current instruction.
!  * This compensates for a preceding ISN_CMDMOD and ISN_PROF_START.
   */
      static int
  current_instr_idx(cctx_T *cctx)
***************
*** 7732,7738 ****
  
      if (cctx->ctx_skip == SKIP_UNKNOWN)
      {
!       int moved_cmdmod = FALSE;
  
        // Move any CMDMOD instruction to after the jump
        if (((isn_T *)instr->ga_data)[instr->ga_len - 1].isn_type == ISN_CMDMOD)
--- 7732,7740 ----
  
      if (cctx->ctx_skip == SKIP_UNKNOWN)
      {
!       int         moved_cmdmod = FALSE;
!       int         saved_debug = FALSE;
!       isn_T       debug_isn;
  
        // Move any CMDMOD instruction to after the jump
        if (((isn_T *)instr->ga_data)[instr->ga_len - 1].isn_type == ISN_CMDMOD)
***************
*** 7745,7758 ****
--- 7747,7781 ----
            moved_cmdmod = TRUE;
        }
  
+       // Remove the already generated ISN_DEBUG, it is written below the
+       // ISN_FOR instruction.
+       if (cctx->ctx_compile_type == CT_DEBUG && instr->ga_len > 0
+               && ((isn_T *)instr->ga_data)[instr->ga_len - 1]
+                                                       .isn_type == ISN_DEBUG)
+       {
+           --instr->ga_len;
+           debug_isn = ((isn_T *)instr->ga_data)[instr->ga_len];
+           saved_debug = TRUE;
+       }
+ 
        if (compile_jump_to_end(&scope->se_u.se_if.is_end_label,
                                                    JUMP_ALWAYS, cctx) == FAIL)
            return NULL;
        // previous "if" or "elseif" jumps here
        isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label;
        isn->isn_arg.jump.jump_where = instr->ga_len;
+ 
        if (moved_cmdmod)
            ++instr->ga_len;
+ 
+       if (saved_debug)
+       {
+           // move the debug instruction here
+           if (GA_GROW_FAILS(instr, 1))
+               return NULL;
+           ((isn_T *)instr->ga_data)[instr->ga_len] = debug_isn;
+           ++instr->ga_len;
+       }
      }
  
      // compile "expr"; if we know it evaluates to FALSE skip the block
*** ../vim-8.2.3365/src/testdir/test_vim9_disassemble.vim       2021-08-15 
20:36:24.367246779 +0200
--- src/testdir/test_vim9_disassemble.vim       2021-08-22 13:23:53.769594306 
+0200
***************
*** 2255,2260 ****
--- 2255,2307 ----
          res)
  enddef
  
+ def s:DebugElseif()
+   var b = false
+   if b
+     eval 1 + 0
+   silent elseif !b
+     eval 2 + 0
+   endif
+ enddef
+ 
+ def Test_debug_elseif()
+   var res = execute('disass debug s:DebugElseif')
+   assert_match('<SNR>\d*_DebugElseif\_s*' ..
+           'var b = false\_s*' ..
+           '0 DEBUG line 1-1 varcount 0\_s*' ..
+           '1 PUSH false\_s*' ..
+           '2 STORE $0\_s*' ..
+ 
+           'if b\_s*' ..
+           '3 DEBUG line 2-2 varcount 1\_s*' ..
+           '4 LOAD $0\_s*' ..
+           '5 JUMP_IF_FALSE -> 10\_s*' ..
+ 
+           'eval 1 + 0\_s*' ..
+           '6 DEBUG line 3-3 varcount 1\_s*' ..
+           '7 PUSHNR 1\_s*' ..
+           '8 DROP\_s*' ..
+ 
+           'silent elseif !b\_s*' ..
+           '9 JUMP -> 20\_s*' ..
+           '10 CMDMOD silent\_s*' ..
+           '11 DEBUG line 4-4 varcount 1\_s*' ..
+           '12 LOAD $0\_s*' ..
+           '13 INVERT -1 (!val)\_s*' ..
+           '14 CMDMOD_REV\_s*' ..
+           '15 JUMP_IF_FALSE -> 20\_s*' ..
+ 
+           'eval 2 + 0\_s*' ..
+           '16 DEBUG line 5-5 varcount 1\_s*' ..
+           '17 PUSHNR 2\_s*' ..
+           '18 DROP\_s*' ..
+ 
+           'endif\_s*' ..
+           '19 DEBUG line 6-6 varcount 1\_s*' ..
+           '20 RETURN void*',
+         res)
+ enddef
+ 
  def s:EchoMessages()
    echohl ErrorMsg | echom v:exception | echohl NONE
  enddef
*** ../vim-8.2.3365/src/version.c       2021-08-21 20:50:31.210336766 +0200
--- src/version.c       2021-08-22 13:16:19.982936410 +0200
***************
*** 757,758 ****
--- 757,760 ----
  {   /* Add new patch number below this line */
+ /**/
+     3366,
  /**/

-- 
   Another bucket of what can only be described as human ordure hits ARTHUR.
ARTHUR: ... Right!  (to the KNIGHTS) That settles it!
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202108221136.17MBa4x61366190%40masaka.moolenaar.net.

Raspunde prin e-mail lui