Skip to content

Commit

Permalink
patch 8.2.3086: Vim9: breakpoint on "for" does not work
Browse files Browse the repository at this point in the history
Problem:    Vim9: breakpoint on "for" does not work.
Solution:   Use the right line number in ISN_DEBUG. (closes #8486)
  • Loading branch information
brammool committed Jul 3, 2021
1 parent acbb4b5 commit 6fc0161
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/testdir/test_debugger.vim
Expand Up @@ -1017,6 +1017,13 @@ func Test_debug_def_function()
# comment
echo "second"
enddef
def g:FuncForLoop()
eval 1
for i in [11, 22, 33]
eval i
endfor
echo "done"
enddef
END
call writefile(file, 'Xtest.vim')

Expand Down Expand Up @@ -1062,6 +1069,15 @@ func Test_debug_def_function()
call RunDbgCmd(buf, ':call FuncComment()', ['function FuncComment', 'line 2: echo "first" .. "one"'])
call RunDbgCmd(buf, ':breakadd func 3 FuncComment')
call RunDbgCmd(buf, 'cont', ['function FuncComment', 'line 5: echo "second"'])
call RunDbgCmd(buf, 'cont')

call RunDbgCmd(buf, ':breakadd func 2 FuncForLoop')
call RunDbgCmd(buf, ':call FuncForLoop()', ['function FuncForLoop', 'line 2: for i in [11, 22, 33]'])
call RunDbgCmd(buf, 'echo i', ['11'])
call RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 3: eval i'])
call RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 4: endfor'])
call RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 2: for i in [11, 22, 33]'])
call RunDbgCmd(buf, 'echo i', ['22'])

call RunDbgCmd(buf, 'cont')
call StopVimInTerminal(buf)
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -755,6 +755,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3086,
/**/
3085,
/**/
Expand Down
12 changes: 12 additions & 0 deletions src/vim9compile.c
Expand Up @@ -7747,6 +7747,7 @@ compile_for(char_u *arg_start, cctx_T *cctx)
type_T *vartype;
type_T *item_type = &t_any;
int idx;
int prev_lnum = cctx->ctx_prev_lnum;

p = skip_var_list(arg_start, TRUE, &var_count, &semicolon, FALSE);
if (p == NULL)
Expand Down Expand Up @@ -7774,7 +7775,11 @@ compile_for(char_u *arg_start, cctx_T *cctx)
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;
prev_lnum = ((isn_T *)instr->ga_data)[instr->ga_len]
.isn_arg.debug.dbg_break_lnum;
}

scope = new_scope(cctx, FOR_SCOPE);
if (scope == NULL)
Expand Down Expand Up @@ -7934,8 +7939,15 @@ compile_for(char_u *arg_start, cctx_T *cctx)
}

if (cctx->ctx_compile_type == CT_DEBUG)
{
int save_prev_lnum = cctx->ctx_prev_lnum;

// Add ISN_DEBUG here, so that the loop variables can be inspected.
// Use the prev_lnum from the ISN_DEBUG instruction removed above.
cctx->ctx_prev_lnum = prev_lnum;
generate_instr_debug(cctx);
cctx->ctx_prev_lnum = save_prev_lnum;
}

return arg_end;

Expand Down

0 comments on commit 6fc0161

Please sign in to comment.