patch 8.2.3039: Vim9: breakpoint at a comment line does not work
Problem: Vim9: breakpoint at a comment line does not work.
Solution: Add the comment line number to the debug instruction.
(closes #8429)
diff --git a/src/testdir/test_debugger.vim b/src/testdir/test_debugger.vim
index 81e8658..4601319 100644
--- a/src/testdir/test_debugger.vim
+++ b/src/testdir/test_debugger.vim
@@ -947,7 +947,7 @@
def LocalFunc()
echo "first"
echo "second"
- breakadd func 1 LegacyFunc
+ breakadd func LegacyFunc
LegacyFunc()
enddef
@@ -1010,6 +1010,13 @@
eval 1
enddef
enddef
+ def g:FuncComment()
+ # comment
+ echo "first"
+ .. "one"
+ # comment
+ echo "second"
+ enddef
END
call writefile(file, 'Xtest.vim')
@@ -1049,6 +1056,12 @@
\ ['cmd: call FuncWithDict()'])
call RunDbgCmd(buf, 'step', ['line 1: var d = { a: 1, b: 2, }'])
call RunDbgCmd(buf, 'step', ['line 6: def Inner()'])
+ call RunDbgCmd(buf, 'cont')
+
+ call RunDbgCmd(buf, ':breakadd func 1 FuncComment')
+ 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 StopVimInTerminal(buf)
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 7938d91..1d100e0 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -2176,7 +2176,9 @@
enddef
def s:Profiled(): string
+ # comment
echo "profiled"
+ # comment
var some = "some text"
return "done"
enddef
@@ -2187,18 +2189,20 @@
endif
var res = execute('disass profile s:Profiled')
assert_match('<SNR>\d*_Profiled\_s*' ..
+ '# comment\_s*' ..
'echo "profiled"\_s*' ..
- '\d PROFILE START line 1\_s*' ..
+ '\d PROFILE START line 2\_s*' ..
'\d PUSHS "profiled"\_s*' ..
'\d ECHO 1\_s*' ..
+ '# comment\_s*' ..
'var some = "some text"\_s*' ..
'\d PROFILE END\_s*' ..
- '\d PROFILE START line 2\_s*' ..
+ '\d PROFILE START line 4\_s*' ..
'\d PUSHS "some text"\_s*' ..
'\d STORE $0\_s*' ..
'return "done"\_s*' ..
'\d PROFILE END\_s*' ..
- '\d PROFILE START line 3\_s*' ..
+ '\d PROFILE START line 5\_s*' ..
'\d PUSHS "done"\_s*' ..
'\d\+ RETURN\_s*' ..
'\d\+ PROFILE END',
@@ -2208,16 +2212,18 @@
def Test_debugged()
var res = execute('disass debug s:Profiled')
assert_match('<SNR>\d*_Profiled\_s*' ..
+ '# comment\_s*' ..
'echo "profiled"\_s*' ..
- '\d DEBUG line 1 varcount 0\_s*' ..
+ '\d DEBUG line 1-2 varcount 0\_s*' ..
'\d PUSHS "profiled"\_s*' ..
'\d ECHO 1\_s*' ..
+ '# comment\_s*' ..
'var some = "some text"\_s*' ..
- '\d DEBUG line 2 varcount 0\_s*' ..
+ '\d DEBUG line 3-4 varcount 0\_s*' ..
'\d PUSHS "some text"\_s*' ..
'\d STORE $0\_s*' ..
'return "done"\_s*' ..
- '\d DEBUG line 3 varcount 1\_s*' ..
+ '\d DEBUG line 5-5 varcount 1\_s*' ..
'\d PUSHS "done"\_s*' ..
'\d RETURN\_s*',
res)
diff --git a/src/version.c b/src/version.c
index 4d89fc2..83c7460 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3039,
+/**/
3038,
/**/
3037,
diff --git a/src/vim9.h b/src/vim9.h
index 58d451c..97b9a3e 100644
--- a/src/vim9.h
+++ b/src/vim9.h
@@ -168,8 +168,7 @@
ISN_PROF_START, // start a line for profiling
ISN_PROF_END, // end a line for profiling
- ISN_DEBUG, // check for debug breakpoint, isn_arg.number is current
- // number of local variables
+ ISN_DEBUG, // check for debug breakpoint, uses isn_arg.debug
ISN_UNPACK, // unpack list into items, uses isn_arg.unpack
ISN_SHUFFLE, // move item on stack up or down
@@ -391,6 +390,12 @@
int invert;
} tobool_T;
+// arguments to ISN_DEBUG
+typedef struct {
+ varnumber_T dbg_var_names_len; // current number of local variables
+ int dbg_break_lnum; // first line to break after
+} debug_T;
+
/*
* Instruction
*/
@@ -439,6 +444,7 @@
tostring_T tostring;
tobool_T tobool;
getitem_T getitem;
+ debug_T debug;
} isn_arg;
};
diff --git a/src/vim9compile.c b/src/vim9compile.c
index c5a2c2d..e78a032 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -174,6 +174,9 @@
char_u *ctx_line_start; // start of current line or NULL
garray_T ctx_instr; // generated instructions
+ int ctx_prev_lnum; // line number below previous command, for
+ // debugging
+
compiletype_T ctx_compile_type;
garray_T ctx_locals; // currently visible local variables
@@ -585,7 +588,8 @@
if ((isn = generate_instr(cctx, ISN_DEBUG)) == NULL)
return NULL;
- isn->isn_arg.number = dfunc->df_var_names.ga_len;
+ isn->isn_arg.debug.dbg_var_names_len = dfunc->df_var_names.ga_len;
+ isn->isn_arg.debug.dbg_break_lnum = cctx->ctx_prev_lnum;
return isn;
}
@@ -9270,6 +9274,7 @@
debug_lnum = cctx.ctx_lnum;
generate_instr_debug(&cctx);
}
+ cctx.ctx_prev_lnum = cctx.ctx_lnum + 1;
// Some things can be recognized by the first character.
switch (*ea.cmd)
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 6d0da61..3233e3c 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1473,14 +1473,14 @@
// check for the next breakpoint if needed
breakpoint = dbg_find_breakpoint(FALSE, ufunc->uf_name,
- iptr->isn_lnum - 1);
+ iptr->isn_arg.debug.dbg_break_lnum);
if (breakpoint <= 0 || breakpoint > iptr->isn_lnum)
return;
}
SOURCING_LNUM = iptr->isn_lnum;
debug_context = ectx;
- debug_var_count = iptr->isn_arg.number;
+ debug_var_count = iptr->isn_arg.debug.dbg_var_names_len;
for (ni = iptr + 1; ni->isn_type != ISN_FINISH; ++ni)
if (ni->isn_type == ISN_DEBUG
@@ -5476,8 +5476,10 @@
break;
case ISN_DEBUG:
- smsg("%s%4d DEBUG line %d varcount %lld", pfx, current,
- iptr->isn_lnum, iptr->isn_arg.number);
+ smsg("%s%4d DEBUG line %d-%d varcount %lld", pfx, current,
+ iptr->isn_arg.debug.dbg_break_lnum + 1,
+ iptr->isn_lnum,
+ iptr->isn_arg.debug.dbg_var_names_len);
break;
case ISN_UNPACK: smsg("%s%4d UNPACK %d%s", pfx, current,