]> granicus.if.org Git - vim/commitdiff
patch 8.2.3086: Vim9: breakpoint on "for" does not work v8.2.3086
authorBram Moolenaar <Bram@vim.org>
Sat, 3 Jul 2021 11:36:31 +0000 (13:36 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 3 Jul 2021 11:36:31 +0000 (13:36 +0200)
Problem:    Vim9: breakpoint on "for" does not work.
Solution:   Use the right line number in ISN_DEBUG. (closes #8486)

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

index dbf2000462242364e7ad4bf1308f732429fc30a4..bb3a24669de096b038cf58a9b573c2b800e6e492 100644 (file)
@@ -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)
index 70c1b6b97a8293a9b721ef6b52af2483dbff7ae8..6ca650fe0eb4409830947fdaa59dbb85b9e8b38a 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3086,
 /**/
     3085,
 /**/
index 533c0b33ebd5ad0c74a894c13fa5668373dee54c..d07421571330ba6b58a3d6404521625cc94f5daf 100644 (file)
@@ -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;