diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-07-03 13:36:31 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-07-03 13:36:31 +0200 |
commit | 6fc016168249360f0524b68f72cf33efd0574d40 (patch) | |
tree | e88f21b9744bf6bb157814098c9f4dccf6887cab /src | |
parent | acbb4b5720fc27b8b07357b763ed4e5a944ae1da (diff) |
patch 8.2.3086: Vim9: breakpoint on "for" does not workv8.2.3086
Problem: Vim9: breakpoint on "for" does not work.
Solution: Use the right line number in ISN_DEBUG. (closes #8486)
Diffstat (limited to 'src')
-rw-r--r-- | src/testdir/test_debugger.vim | 16 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 12 |
3 files changed, 30 insertions, 0 deletions
diff --git a/src/testdir/test_debugger.vim b/src/testdir/test_debugger.vim index dbf2000462..bb3a24669d 100644 --- a/src/testdir/test_debugger.vim +++ b/src/testdir/test_debugger.vim @@ -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') @@ -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) diff --git a/src/version.c b/src/version.c index 70c1b6b97a..6ca650fe0e 100644 --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3086, +/**/ 3085, /**/ 3084, diff --git a/src/vim9compile.c b/src/vim9compile.c index 533c0b33eb..d074215713 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -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) @@ -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) @@ -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; |