summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-06-16 22:24:40 +0200
committerBram Moolenaar <Bram@vim.org>2021-06-16 22:24:40 +0200
commit4cea536bdf48df459e7ad651dfee006844bbf2c0 (patch)
tree3ff2e149ad2a9d6386d93938e0e14f0969f84221
parent29f0dc3689eafcf7888e06d57d1cf79e62c5c148 (diff)
patch 8.2.3013: Vim: when debugging only first line of command is displayedv8.2.3013
Problem: Vim: when debugging only the first line of a command using line continuation is displayed. Solution: Find the next command and concatenate lines until that one. (closes #8392)
-rw-r--r--src/testdir/test_debugger.vim45
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c62
3 files changed, 78 insertions, 31 deletions
diff --git a/src/testdir/test_debugger.vim b/src/testdir/test_debugger.vim
index 5326576d02..a6e3966096 100644
--- a/src/testdir/test_debugger.vim
+++ b/src/testdir/test_debugger.vim
@@ -885,19 +885,19 @@ func Test_Backtrace_DefFunction()
\ ':debug call GlobalFunction()',
\ ['cmd: call GlobalFunction()'])
- call RunDbgCmd(buf, 'step', ['line 1: var some = "some var"'])
- call RunDbgCmd(buf, 'step', ['line 2: CallAFunction()'])
+ call RunDbgCmd(buf, 'step', ['line 1: var some = "some var"'])
+ call RunDbgCmd(buf, 'step', ['line 2: CallAFunction()'])
call RunDbgCmd(buf, 'echo some', ['some var'])
call RunDbgCmd(buf, 'backtrace', [
\ '\V>backtrace',
\ '\V->0 function GlobalFunction',
- \ '\Vline 2: CallAFunction()',
+ \ '\Vline 2: CallAFunction()',
\ ],
\ #{match: 'pattern'})
- call RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()'])
- call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
+ call RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()'])
+ call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
" Repeated line, because we fist are in the compiled function before the
" EXEC and then in do_cmdline() before the :source command.
call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
@@ -952,6 +952,13 @@ func Test_debug_def_function()
endfor
echo "done"
enddef
+
+ def g:FuncWithDict()
+ var d = {
+ a: 1,
+ b: 2,
+ }
+ enddef
END
call writefile(file, 'Xtest.vim')
@@ -967,23 +974,29 @@ func Test_debug_def_function()
call RunDbgCmd(buf,
\ ':debug call FuncWithArgs("asdf", 42, 1, 2, 3)',
\ ['cmd: call FuncWithArgs("asdf", 42, 1, 2, 3)'])
- call RunDbgCmd(buf, 'step', ['line 1: echo text .. nr'])
+ call RunDbgCmd(buf, 'step', ['line 1: echo text .. nr'])
call RunDbgCmd(buf, 'echo text', ['asdf'])
call RunDbgCmd(buf, 'echo nr', ['42'])
call RunDbgCmd(buf, 'echo items', ['[1, 2, 3]'])
- call RunDbgCmd(buf, 'step', ['asdf42', 'function FuncWithArgs', 'line 2: for it in items'])
+ call RunDbgCmd(buf, 'step', ['asdf42', 'function FuncWithArgs', 'line 2: for it in items'])
call RunDbgCmd(buf, 'echo it', ['1'])
- call RunDbgCmd(buf, 'step', ['line 3: echo it'])
- call RunDbgCmd(buf, 'step', ['1', 'function FuncWithArgs', 'line 4: endfor'])
- call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
+ call RunDbgCmd(buf, 'step', ['line 3: echo it'])
+ call RunDbgCmd(buf, 'step', ['1', 'function FuncWithArgs', 'line 4: endfor'])
+ call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
call RunDbgCmd(buf, 'echo it', ['2'])
- call RunDbgCmd(buf, 'step', ['line 3: echo it'])
- call RunDbgCmd(buf, 'step', ['2', 'function FuncWithArgs', 'line 4: endfor'])
- call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
+ call RunDbgCmd(buf, 'step', ['line 3: echo it'])
+ call RunDbgCmd(buf, 'step', ['2', 'function FuncWithArgs', 'line 4: endfor'])
+ call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
call RunDbgCmd(buf, 'echo it', ['3'])
- call RunDbgCmd(buf, 'step', ['line 3: echo it'])
- call RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4: endfor'])
- call RunDbgCmd(buf, 'step', ['line 5: echo "done"'])
+ call RunDbgCmd(buf, 'step', ['line 3: echo it'])
+ call RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4: endfor'])
+ call RunDbgCmd(buf, 'step', ['line 5: echo "done"'])
+ call RunDbgCmd(buf, 'cont')
+
+ call RunDbgCmd(buf,
+ \ ':debug call FuncWithDict()',
+ \ ['cmd: call FuncWithDict()'])
+ call RunDbgCmd(buf, 'step', ['line 1: var d = { a: 1, b: 2, }'])
call RunDbgCmd(buf, 'cont')
call StopVimInTerminal(buf)
diff --git a/src/version.c b/src/version.c
index 1b23c664d5..2dff11cd7a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3013,
+/**/
3012,
/**/
3011,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index bbcf7ffc3c..33e9244245 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1433,6 +1433,52 @@ lookup_debug_var(char_u *name)
return NULL;
}
+ static void
+handle_debug(isn_T *iptr, ectx_T *ectx)
+{
+ char_u *line;
+ ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data)
+ + ectx->ec_dfunc_idx)->df_ufunc;
+ isn_T *ni;
+ int end_lnum = iptr->isn_lnum;
+ garray_T ga;
+ int lnum;
+
+ SOURCING_LNUM = iptr->isn_lnum;
+ debug_context = ectx;
+ debug_var_count = iptr->isn_arg.number;
+
+ for (ni = iptr + 1; ni->isn_type != ISN_FINISH; ++ni)
+ if (ni->isn_type == ISN_DEBUG
+ || ni->isn_type == ISN_RETURN
+ || ni->isn_type == ISN_RETURN_VOID)
+ {
+ end_lnum = ni->isn_lnum;
+ break;
+ }
+
+ if (end_lnum > iptr->isn_lnum)
+ {
+ ga_init2(&ga, sizeof(char_u *), 10);
+ for (lnum = iptr->isn_lnum; lnum < end_lnum; ++lnum)
+ if (ga_grow(&ga, 1) == OK)
+ ((char_u **)(ga.ga_data))[ga.ga_len++] =
+ skipwhite(((char_u **)ufunc->uf_lines.ga_data)[lnum - 1]);
+ line = ga_concat_strings(&ga, " ");
+ vim_free(ga.ga_data);
+ }
+ else
+ line = ((char_u **)ufunc->uf_lines.ga_data)[iptr->isn_lnum - 1];
+ if (line == NULL)
+ line = (char_u *)"[empty]";
+
+ do_debug(line);
+ debug_context = NULL;
+
+ if (end_lnum > iptr->isn_lnum)
+ vim_free(line);
+}
+
/*
* Execute instructions in execution context "ectx".
* Return OK or FAIL;
@@ -4156,21 +4202,7 @@ exec_instructions(ectx_T *ectx)
case ISN_DEBUG:
if (ex_nesting_level <= debug_break_level)
- {
- char_u *line;
- ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data)
- + ectx->ec_dfunc_idx)->df_ufunc;
-
- SOURCING_LNUM = iptr->isn_lnum;
- debug_context = ectx;
- debug_var_count = iptr->isn_arg.number;
- line = ((char_u **)ufunc->uf_lines.ga_data)[
- iptr->isn_lnum - 1];
- if (line == NULL)
- line = (char_u *)"[empty]";
- do_debug(line);
- debug_context = NULL;
- }
+ handle_debug(iptr, ectx);
break;
case ISN_SHUFFLE: