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.