]> granicus.if.org Git - vim/commitdiff
patch 8.2.3013: Vim: when debugging only first line of command is displayed v8.2.3013
authorBram Moolenaar <Bram@vim.org>
Wed, 16 Jun 2021 20:24:40 +0000 (22:24 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 16 Jun 2021 20:24:40 +0000 (22:24 +0200)
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)

src/testdir/test_debugger.vim
src/version.c
src/vim9execute.c

index 5326576d02144add5b33bac2539091cf21549af0..a6e3966096e8a5fcc17e7c69387f1b3e957d8f33 100644 (file)
@@ -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)
index 1b23c664d5c61adcd893397f90c7777b4fda922c..2dff11cd7aca05167d16c40d834ef04c4472f155 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3013,
 /**/
     3012,
 /**/
index bbcf7ffc3c0cd0bd205ea01e3a18156ed4520751..33e92442451db53e42c2de0e0c05c7146a9a94cd 100644 (file)
@@ -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: