# HG changeset patch # User Bram Moolenaar # Date 1640294103 -3600 # Node ID 254fffd11fda28700a5f2ef99f64be3044da22e8 # Parent 052ba9029066efd24aa4db418aaca6842a370897 patch 8.2.3878: Vim9: debugger tries to read more lines than there are Commit: https://github.com/vim/vim/commit/310091d20f26f6472fefc31e19004684f3d640bf Author: Bram Moolenaar Date: Thu Dec 23 21:14:37 2021 +0000 patch 8.2.3878: Vim9: debugger tries to read more lines than there are Problem: Vim9: debugger tries to read more lines than there are. Solution: Check the number of lines. (closes https://github.com/vim/vim/issues/9394) diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -4731,6 +4731,46 @@ def Run_Test_debug_with_lambda() delete('XdebugFunc') enddef +func Test_debug_running_out_of_lines() + CheckRunVimInTerminal + + " call indirectly to avoid compilation error for missing functions + call Run_Test_debug_running_out_of_lines() +endfunc + +def Run_Test_debug_running_out_of_lines() + var lines =<< trim END + vim9script + def Crash() + # + # + # + # + # + # + # + if true + # + endif + enddef + breakadd func Crash + Crash() + END + writefile(lines, 'XdebugFunc') + var buf = RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0}) + WaitForAssert(() => assert_match('^>', term_getline(buf, 6))) + + term_sendkeys(buf, "next\") + TermWait(buf) + WaitForAssert(() => assert_match('^>', term_getline(buf, 6))) + + term_sendkeys(buf, "cont\") + TermWait(buf) + + StopVimInTerminal(buf) + delete('XdebugFunc') +enddef + def ProfiledWithLambda() var n = 3 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3878, +/**/ 3877, /**/ 3876, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1660,7 +1660,8 @@ handle_debug(isn_T *iptr, ectx_T *ectx) if (end_lnum > iptr->isn_lnum) { ga_init2(&ga, sizeof(char_u *), 10); - for (lnum = iptr->isn_lnum; lnum < end_lnum; ++lnum) + for (lnum = iptr->isn_lnum; lnum < end_lnum + && lnum <= ufunc->uf_lines.ga_len; ++lnum) { char_u *p = ((char_u **)ufunc->uf_lines.ga_data)[lnum - 1];