# HG changeset patch # User Bram Moolenaar # Date 1623875403 -7200 # Node ID ffe784fdec57d55f795dfc3f30c7daf68b6e073b # Parent 8972f6de0a402fc8eb1fe357828327fb5799807f patch 8.2.3013: Vim: when debugging only first line of command is displayed Commit: https://github.com/vim/vim/commit/4cea536bdf48df459e7ad651dfee006844bbf2c0 Author: Bram Moolenaar Date: Wed Jun 16 22:24:40 2021 +0200 patch 8.2.3013: Vim: when debugging only first line of command is displayed 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) diff --git a/src/testdir/test_debugger.vim b/src/testdir/test_debugger.vim --- 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 --- 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 --- 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: