diff src/vim9compile.c @ 25660:7b80b25a5c2b v8.2.3366

patch 8.2.3366: Vim9: debugging elseif does not stop before condition Commit: https://github.com/vim/vim/commit/093165c899f1620543844d1c1a7a05975697c286 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Aug 22 13:35:31 2021 +0200 patch 8.2.3366: Vim9: debugging elseif does not stop before condition Problem: Vim9: debugging elseif does not stop before condition. Solution: Move debug statement to after the jump. (closes https://github.com/vim/vim/issues/8781)
author Bram Moolenaar <Bram@vim.org>
date Sun, 22 Aug 2021 13:45:04 +0200
parents 483b40e87ca5
children 812c75fd255c
line wrap: on
line diff
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -2387,7 +2387,7 @@ misplaced_cmdmod(cctx_T *cctx)
 
 /*
  * Get the index of the current instruction.
- * This compenstates for a preceding ISN_CMDMOD and ISN_PROF_START.
+ * This compensates for a preceding ISN_CMDMOD and ISN_PROF_START.
  */
     static int
 current_instr_idx(cctx_T *cctx)
@@ -7732,7 +7732,9 @@ compile_elseif(char_u *arg, cctx_T *cctx
 
     if (cctx->ctx_skip == SKIP_UNKNOWN)
     {
-	int moved_cmdmod = FALSE;
+	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,14 +7747,35 @@ compile_elseif(char_u *arg, cctx_T *cctx
 	    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