summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-07-03 13:36:31 +0200
committerBram Moolenaar <Bram@vim.org>2021-07-03 13:36:31 +0200
commit6fc016168249360f0524b68f72cf33efd0574d40 (patch)
treee88f21b9744bf6bb157814098c9f4dccf6887cab
parentacbb4b5720fc27b8b07357b763ed4e5a944ae1da (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)
-rw-r--r--src/testdir/test_debugger.vim16
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c12
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;