To: vim_dev@googlegroups.com Subject: Patch 9.0.1570 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.1570 Problem: Some tests are slow. Solution: Make a few test cases faster. Files: src/testdir/test_cmdline.vim, src/testdir/test_codestyle.vim, src/testdir/test_debugger.vim, src/testdir/test_filetype.vim *** ../vim-9.0.1569/src/testdir/test_cmdline.vim 2023-04-17 16:40:54.724586083 +0100 --- src/testdir/test_cmdline.vim 2023-05-19 20:24:12.757768306 +0100 *************** *** 791,800 **** endfunc func Test_expand_star_star() ! call mkdir('a/b', 'pR') ! call writefile(['asdfasdf'], 'a/b/fileXname') ! call feedkeys(":find **/fileXname\\", 'xt') ! call assert_equal('find a/b/fileXname', @:) bwipe! endfunc --- 791,800 ---- endfunc func Test_expand_star_star() ! call mkdir('a/b/c', 'pR') ! call writefile(['asdfasdf'], 'a/b/c/fileXname') ! call feedkeys(":find a/**/fileXname\\", 'xt') ! call assert_equal('find a/b/c/fileXname', @:) bwipe! endfunc *** ../vim-9.0.1569/src/testdir/test_codestyle.vim 2023-05-09 14:59:55.960088968 +0100 --- src/testdir/test_codestyle.vim 2023-05-19 20:41:15.034933084 +0100 *************** *** 2,7 **** --- 2,8 ---- def Test_source_files() for fname in glob('../*.[ch]', 0, 1) + bwipe! exe 'edit ' .. fname cursor(1, 1) *************** *** 26,36 **** lnum = search(')\s*{', '', 0, 0, skip) assert_equal(0, lnum, fname .. ': curly after closing paren') - cursor(1, 1) # Examples in comments use double quotes. skip = "getline('.') =~ '\"'" ! # Avoid examples that contain: "} else ! lnum = search('[^"]}\s*else', '', 0, 0, skip) assert_equal(0, lnum, fname .. ': curly before "else"') cursor(1, 1) --- 27,37 ---- lnum = search(')\s*{', '', 0, 0, skip) assert_equal(0, lnum, fname .. ': curly after closing paren') # Examples in comments use double quotes. skip = "getline('.') =~ '\"'" ! ! cursor(1, 1) ! lnum = search('}\s*else', '', 0, 0, skip) assert_equal(0, lnum, fname .. ': curly before "else"') cursor(1, 1) *** ../vim-9.0.1569/src/testdir/test_debugger.vim 2022-10-07 18:51:20.139679475 +0100 --- src/testdir/test_debugger.vim 2023-05-19 21:30:09.125965047 +0100 *************** *** 20,58 **** " "options" argument can contain: " 'msec' - time to wait for a match " 'match' - "pattern" to use "lines" as pattern instead of text ! func CheckDbgOutput(buf, lines, options = {}) ! " Verify the expected output ! let lnum = 20 - len(a:lines) ! let msec = get(a:options, 'msec', 1000) ! for l in a:lines ! if get(a:options, 'match', 'equal') ==# 'pattern' ! call WaitForAssert({-> assert_match(l, term_getline(a:buf, lnum))}, msec) else ! call WaitForAssert({-> assert_equal(l, term_getline(a:buf, lnum))}, msec) endif ! let lnum += 1 endfor ! endfunc " Run a Vim debugger command " If the expected output argument is supplied, then check for it. ! func RunDbgCmd(buf, cmd, ...) ! call term_sendkeys(a:buf, a:cmd . "\r") ! call TermWait(a:buf) ! ! if a:0 != 0 ! let options = #{match: 'equal'} ! if a:0 > 1 ! call extend(options, a:2) endif ! call CheckDbgOutput(a:buf, a:1, options) endif ! endfunc " Debugger tests ! func Test_Debugger() ! " Create a Vim script with some functions ! let lines =<< trim END func Foo() let var1 = 1 let var2 = Bar(var1) + 9 --- 20,58 ---- " "options" argument can contain: " 'msec' - time to wait for a match " 'match' - "pattern" to use "lines" as pattern instead of text ! def s:CheckDbgOutput(buf: number, lines: list, options = {}) ! # Verify the expected output ! var lnum = 20 - len(lines) ! var msec = get(options, 'msec', 1000) ! for l in lines ! if get(options, 'match', 'equal') ==# 'pattern' ! g:WaitForAssert(() => assert_match(l, term_getline(buf, lnum)), msec) else ! g:WaitForAssert(() => assert_equal(l, term_getline(buf, lnum)), msec) endif ! lnum += 1 endfor ! enddef " Run a Vim debugger command " If the expected output argument is supplied, then check for it. ! def s:RunDbgCmd(buf: number, cmd: string, ...extra: list) ! term_sendkeys(buf, cmd .. "\r") ! g:TermWait(buf) ! ! if len(extra) > 0 ! var options = {match: 'equal'} ! if len(extra) > 1 ! extend(options, extra[1]) endif ! s:CheckDbgOutput(buf, extra[0], options) endif ! enddef " Debugger tests ! def Test_Debugger() ! # Create a Vim script with some functions ! var lines =<< trim END func Foo() let var1 = 1 let var2 = Bar(var1) + 9 *************** *** 81,337 **** endfor enddef END ! call writefile(lines, 'XtestDebug.vim', 'D') ! " Start Vim in a terminal ! let buf = RunVimInTerminal('-S XtestDebug.vim', {}) ! " Start the Vim debugger ! call RunDbgCmd(buf, ':debug echo Foo()', ['cmd: echo Foo()']) ! " Create a few stack frames by stepping through functions ! call RunDbgCmd(buf, 'step', ['line 1: let var1 = 1']) ! call RunDbgCmd(buf, 'step', ['line 2: let var2 = Bar(var1) + 9']) ! call RunDbgCmd(buf, 'step', ['line 1: let var1 = 2 + a:var']) ! call RunDbgCmd(buf, 'step', ['line 2: let var2 = Bazz(var1) + 4']) ! call RunDbgCmd(buf, 'step', ['line 1: try']) ! call RunDbgCmd(buf, 'step', ['line 2: let var1 = 3 + a:var']) ! call RunDbgCmd(buf, 'step', ['line 3: let var3 = "another var"']) ! ! " check backtrace ! call RunDbgCmd(buf, 'backtrace', [ ! \ ' 2 function Foo[2]', ! \ ' 1 Bar[2]', ! \ '->0 Bazz', ! \ 'line 3: let var3 = "another var"']) ! ! " Check variables in different stack frames ! call RunDbgCmd(buf, 'echo var1', ['6']) ! ! call RunDbgCmd(buf, 'up') ! call RunDbgCmd(buf, 'back', [ ! \ ' 2 function Foo[2]', ! \ '->1 Bar[2]', ! \ ' 0 Bazz', ! \ 'line 3: let var3 = "another var"']) ! call RunDbgCmd(buf, 'echo var1', ['3']) ! ! call RunDbgCmd(buf, 'u') ! call RunDbgCmd(buf, 'bt', [ ! \ '->2 function Foo[2]', ! \ ' 1 Bar[2]', ! \ ' 0 Bazz', ! \ 'line 3: let var3 = "another var"']) ! call RunDbgCmd(buf, 'echo var1', ['1']) ! ! " Undefined variables ! call RunDbgCmd(buf, 'step') ! call RunDbgCmd(buf, 'frame 2') ! call RunDbgCmd(buf, 'echo var3', [ ! \ 'Error detected while processing function Foo[2]..Bar[2]..Bazz:', ! \ 'line 4:', ! \ 'E121: Undefined variable: var3']) ! ! " var3 is defined in this level with some other value ! call RunDbgCmd(buf, 'fr 0') ! call RunDbgCmd(buf, 'echo var3', ['another var']) ! ! call RunDbgCmd(buf, 'step') ! call RunDbgCmd(buf, '') ! call RunDbgCmd(buf, '') ! call RunDbgCmd(buf, '') ! call RunDbgCmd(buf, '') ! call RunDbgCmd(buf, 'step', [ ! \ 'function Foo[2]..Bar', ! \ 'line 3: End of function']) ! call RunDbgCmd(buf, 'up') ! ! " Undefined var2 ! call RunDbgCmd(buf, 'echo var2', [ ! \ 'Error detected while processing function Foo[2]..Bar:', ! \ 'line 3:', ! \ 'E121: Undefined variable: var2']) ! ! " Var2 is defined with 10 ! call RunDbgCmd(buf, 'down') ! call RunDbgCmd(buf, 'echo var2', ['10']) ! ! " Backtrace movements ! call RunDbgCmd(buf, 'b', [ ! \ ' 1 function Foo[2]', ! \ '->0 Bar', ! \ 'line 3: End of function']) ! ! " next command cannot go down, we are on bottom ! call RunDbgCmd(buf, 'down', ['frame is zero']) ! call RunDbgCmd(buf, 'up') ! ! " next command cannot go up, we are on top ! call RunDbgCmd(buf, 'up', ['frame at highest level: 1']) ! call RunDbgCmd(buf, 'where', [ ! \ '->1 function Foo[2]', ! \ ' 0 Bar', ! \ 'line 3: End of function']) ! ! " fil is not frame or finish, it is file ! call RunDbgCmd(buf, 'fil', ['"[No Name]" --No lines in buffer--']) ! ! " relative backtrace movement ! call RunDbgCmd(buf, 'fr -1') ! call RunDbgCmd(buf, 'frame', [ ! \ ' 1 function Foo[2]', ! \ '->0 Bar', ! \ 'line 3: End of function']) ! ! call RunDbgCmd(buf, 'fr +1') ! call RunDbgCmd(buf, 'fram', [ ! \ '->1 function Foo[2]', ! \ ' 0 Bar', ! \ 'line 3: End of function']) ! ! " go beyond limits does not crash ! call RunDbgCmd(buf, 'fr 100', ['frame at highest level: 1']) ! call RunDbgCmd(buf, 'fra', [ ! \ '->1 function Foo[2]', ! \ ' 0 Bar', ! \ 'line 3: End of function']) ! ! call RunDbgCmd(buf, 'frame -40', ['frame is zero']) ! call RunDbgCmd(buf, 'fram', [ ! \ ' 1 function Foo[2]', ! \ '->0 Bar', ! \ 'line 3: End of function']) ! ! " final result 19 ! call RunDbgCmd(buf, 'cont', ['19']) ! ! " breakpoints tests ! ! " Start a debug session, so that reading the last line from the terminal ! " works properly. ! call RunDbgCmd(buf, ':debug echo Foo()', ['cmd: echo Foo()']) ! ! " No breakpoints ! call RunDbgCmd(buf, 'breakl', ['No breakpoints defined']) ! ! " Place some breakpoints ! call RunDbgCmd(buf, 'breaka func Bar') ! call RunDbgCmd(buf, 'breaklis', [' 1 func Bar line 1']) ! call RunDbgCmd(buf, 'breakadd func 3 Bazz') ! call RunDbgCmd(buf, 'breaklist', [' 1 func Bar line 1', ! \ ' 2 func Bazz line 3']) ! ! " Check whether the breakpoints are hit ! call RunDbgCmd(buf, 'cont', [ ! \ 'Breakpoint in "Bar" line 1', ! \ 'function Foo[2]..Bar', ! \ 'line 1: let var1 = 2 + a:var']) ! call RunDbgCmd(buf, 'cont', [ ! \ 'Breakpoint in "Bazz" line 3', ! \ 'function Foo[2]..Bar[2]..Bazz', ! \ 'line 3: let var3 = "another var"']) ! ! " Delete the breakpoints ! call RunDbgCmd(buf, 'breakd 1') ! call RunDbgCmd(buf, 'breakli', [' 2 func Bazz line 3']) ! call RunDbgCmd(buf, 'breakdel func 3 Bazz') ! call RunDbgCmd(buf, 'breakl', ['No breakpoints defined']) ! ! call RunDbgCmd(buf, 'cont') ! ! " Make sure the breakpoints are removed ! call RunDbgCmd(buf, ':echo Foo()', ['19']) ! ! " Delete a non-existing breakpoint ! call RunDbgCmd(buf, ':breakdel 2', ['E161: Breakpoint not found: 2']) ! ! " Expression breakpoint ! call RunDbgCmd(buf, ':breakadd func 2 Bazz') ! call RunDbgCmd(buf, ':echo Bazz(1)', [ ! \ 'Entering Debug mode. Type "cont" to continue.', ! \ 'function Bazz', ! \ 'line 2: let var1 = 3 + a:var']) ! call RunDbgCmd(buf, 'step') ! call RunDbgCmd(buf, 'step') ! call RunDbgCmd(buf, 'breaka expr var3') ! call RunDbgCmd(buf, 'breakl', [' 3 func Bazz line 2', \ ' 4 expr var3']) ! call RunDbgCmd(buf, 'cont', ['Breakpoint in "Bazz" line 5', ! \ 'Oldval = "''another var''"', ! \ 'Newval = "''value2''"', ! \ 'function Bazz', ! \ 'line 5: catch']) ! ! call RunDbgCmd(buf, 'breakdel *') ! call RunDbgCmd(buf, 'breakl', ['No breakpoints defined']) ! ! " Check for error cases ! call RunDbgCmd(buf, 'breakadd abcd', [ ! \ 'Error detected while processing function Bazz:', ! \ 'line 5:', ! \ 'E475: Invalid argument: abcd']) ! call RunDbgCmd(buf, 'breakadd func', ['E475: Invalid argument: func']) ! call RunDbgCmd(buf, 'breakadd func 2', ['E475: Invalid argument: func 2']) ! call RunDbgCmd(buf, 'breaka func a()', ['E475: Invalid argument: func a()']) ! call RunDbgCmd(buf, 'breakd abcd', ['E475: Invalid argument: abcd']) ! call RunDbgCmd(buf, 'breakd func', ['E475: Invalid argument: func']) ! call RunDbgCmd(buf, 'breakd func a()', ['E475: Invalid argument: func a()']) ! call RunDbgCmd(buf, 'breakd func a', ['E161: Breakpoint not found: func a']) ! call RunDbgCmd(buf, 'breakd expr', ['E475: Invalid argument: expr']) ! call RunDbgCmd(buf, 'breakd expr x', ['E161: Breakpoint not found: expr x']) ! ! " finish the current function ! call RunDbgCmd(buf, 'finish', [ ! \ 'function Bazz', ! \ 'line 8: End of function']) ! call RunDbgCmd(buf, 'cont') ! ! " Test for :next ! call RunDbgCmd(buf, ':debug echo Bar(1)') ! call RunDbgCmd(buf, 'step') ! call RunDbgCmd(buf, 'next') ! call RunDbgCmd(buf, '', [ ! \ 'function Bar', ! \ 'line 3: return var2']) ! call RunDbgCmd(buf, 'c') ! ! " Test for :interrupt ! call RunDbgCmd(buf, ':debug echo Bazz(1)') ! call RunDbgCmd(buf, 'step') ! call RunDbgCmd(buf, 'step') ! call RunDbgCmd(buf, 'interrupt', [ ! \ 'Exception thrown: Vim:Interrupt', ! \ 'function Bazz', ! \ 'line 5: catch']) ! call RunDbgCmd(buf, 'c') ! ! " Test showing local variable in :def function ! call RunDbgCmd(buf, ':breakadd func 2 Vim9Func') ! call RunDbgCmd(buf, ':call Vim9Func()', ['line 2: for _ in [1, 2]']) ! call RunDbgCmd(buf, 'next', ['line 2: for _ in [1, 2]']) ! call RunDbgCmd(buf, 'echo cmd', ['confirm']) ! call RunDbgCmd(buf, 'breakdel *') ! call RunDbgCmd(buf, 'cont') ! ! " Test for :quit ! call RunDbgCmd(buf, ':debug echo Foo()') ! call RunDbgCmd(buf, 'breakdel *') ! call RunDbgCmd(buf, 'breakadd func 3 Foo') ! call RunDbgCmd(buf, 'breakadd func 3 Bazz') ! call RunDbgCmd(buf, 'cont', [ ! \ 'Breakpoint in "Bazz" line 3', ! \ 'function Foo[2]..Bar[2]..Bazz', ! \ 'line 3: let var3 = "another var"']) ! call RunDbgCmd(buf, 'quit', [ ! \ 'Breakpoint in "Foo" line 3', ! \ 'function Foo', ! \ 'line 3: return var2']) ! call RunDbgCmd(buf, 'breakdel *') ! call RunDbgCmd(buf, 'quit') ! call RunDbgCmd(buf, 'enew! | only!') ! call StopVimInTerminal(buf) ! endfunc func Test_Debugger_breakadd() " Tests for :breakadd file and :breakadd here --- 81,337 ---- endfor enddef END ! writefile(lines, 'XtestDebug.vim', 'D') ! # Start Vim in a terminal ! var buf = g:RunVimInTerminal('-S XtestDebug.vim', {}) ! # Start the Vim debugger ! s:RunDbgCmd(buf, ':debug echo Foo()', ['cmd: echo Foo()']) ! # Create a few stack frames by stepping through functions ! s:RunDbgCmd(buf, 'step', ['line 1: let var1 = 1']) ! s:RunDbgCmd(buf, 'step', ['line 2: let var2 = Bar(var1) + 9']) ! s:RunDbgCmd(buf, 'step', ['line 1: let var1 = 2 + a:var']) ! s:RunDbgCmd(buf, 'step', ['line 2: let var2 = Bazz(var1) + 4']) ! s:RunDbgCmd(buf, 'step', ['line 1: try']) ! s:RunDbgCmd(buf, 'step', ['line 2: let var1 = 3 + a:var']) ! s:RunDbgCmd(buf, 'step', ['line 3: let var3 = "another var"']) ! ! # check backtrace ! s:RunDbgCmd(buf, 'backtrace', [ ! ' 2 function Foo[2]', ! ' 1 Bar[2]', ! '->0 Bazz', ! 'line 3: let var3 = "another var"']) ! ! # Check variables in different stack frames ! s:RunDbgCmd(buf, 'echo var1', ['6']) ! ! s:RunDbgCmd(buf, 'up') ! s:RunDbgCmd(buf, 'back', [ ! ' 2 function Foo[2]', ! '->1 Bar[2]', ! ' 0 Bazz', ! 'line 3: let var3 = "another var"']) ! s:RunDbgCmd(buf, 'echo var1', ['3']) ! ! s:RunDbgCmd(buf, 'u') ! s:RunDbgCmd(buf, 'bt', [ ! '->2 function Foo[2]', ! ' 1 Bar[2]', ! ' 0 Bazz', ! 'line 3: let var3 = "another var"']) ! s:RunDbgCmd(buf, 'echo var1', ['1']) ! ! # Undefined variables ! s:RunDbgCmd(buf, 'step') ! s:RunDbgCmd(buf, 'frame 2') ! s:RunDbgCmd(buf, 'echo var3', [ ! 'Error detected while processing function Foo[2]..Bar[2]..Bazz:', ! 'line 4:', ! 'E121: Undefined variable: var3']) ! ! # var3 is defined in this level with some other value ! s:RunDbgCmd(buf, 'fr 0') ! s:RunDbgCmd(buf, 'echo var3', ['another var']) ! ! s:RunDbgCmd(buf, 'step') ! s:RunDbgCmd(buf, '') ! s:RunDbgCmd(buf, '') ! s:RunDbgCmd(buf, '') ! s:RunDbgCmd(buf, '') ! s:RunDbgCmd(buf, 'step', [ ! 'function Foo[2]..Bar', ! 'line 3: End of function']) ! s:RunDbgCmd(buf, 'up') ! ! # Undefined var2 ! s:RunDbgCmd(buf, 'echo var2', [ ! 'Error detected while processing function Foo[2]..Bar:', ! 'line 3:', ! 'E121: Undefined variable: var2']) ! ! # Var2 is defined with 10 ! s:RunDbgCmd(buf, 'down') ! s:RunDbgCmd(buf, 'echo var2', ['10']) ! ! # Backtrace movements ! s:RunDbgCmd(buf, 'b', [ ! ' 1 function Foo[2]', ! '->0 Bar', ! 'line 3: End of function']) ! ! # next command cannot go down, we are on bottom ! s:RunDbgCmd(buf, 'down', ['frame is zero']) ! s:RunDbgCmd(buf, 'up') ! ! # next command cannot go up, we are on top ! s:RunDbgCmd(buf, 'up', ['frame at highest level: 1']) ! s:RunDbgCmd(buf, 'where', [ ! '->1 function Foo[2]', ! ' 0 Bar', ! 'line 3: End of function']) ! ! # fil is not frame or finish, it is file ! s:RunDbgCmd(buf, 'fil', ['"[No Name]" --No lines in buffer--']) ! ! # relative backtrace movement ! s:RunDbgCmd(buf, 'fr -1') ! s:RunDbgCmd(buf, 'frame', [ ! ' 1 function Foo[2]', ! '->0 Bar', ! 'line 3: End of function']) ! ! s:RunDbgCmd(buf, 'fr +1') ! s:RunDbgCmd(buf, 'fram', [ ! '->1 function Foo[2]', ! ' 0 Bar', ! 'line 3: End of function']) ! ! # go beyond limits does not crash ! s:RunDbgCmd(buf, 'fr 100', ['frame at highest level: 1']) ! s:RunDbgCmd(buf, 'fra', [ ! '->1 function Foo[2]', ! ' 0 Bar', ! 'line 3: End of function']) ! ! s:RunDbgCmd(buf, 'frame -40', ['frame is zero']) ! s:RunDbgCmd(buf, 'fram', [ ! ' 1 function Foo[2]', ! '->0 Bar', ! 'line 3: End of function']) ! ! # final result 19 ! s:RunDbgCmd(buf, 'cont', ['19']) ! ! # breakpoints tests ! ! # Start a debug session, so that reading the last line from the terminal ! # works properly. ! s:RunDbgCmd(buf, ':debug echo Foo()', ['cmd: echo Foo()']) ! ! # No breakpoints ! s:RunDbgCmd(buf, 'breakl', ['No breakpoints defined']) ! ! # Place some breakpoints ! s:RunDbgCmd(buf, 'breaka func Bar') ! s:RunDbgCmd(buf, 'breaklis', [' 1 func Bar line 1']) ! s:RunDbgCmd(buf, 'breakadd func 3 Bazz') ! s:RunDbgCmd(buf, 'breaklist', [' 1 func Bar line 1', ! ' 2 func Bazz line 3']) ! ! # Check whether the breakpoints are hit ! s:RunDbgCmd(buf, 'cont', [ ! 'Breakpoint in "Bar" line 1', ! 'function Foo[2]..Bar', ! 'line 1: let var1 = 2 + a:var']) ! s:RunDbgCmd(buf, 'cont', [ ! 'Breakpoint in "Bazz" line 3', ! 'function Foo[2]..Bar[2]..Bazz', ! 'line 3: let var3 = "another var"']) ! ! # Delete the breakpoints ! s:RunDbgCmd(buf, 'breakd 1') ! s:RunDbgCmd(buf, 'breakli', [' 2 func Bazz line 3']) ! s:RunDbgCmd(buf, 'breakdel func 3 Bazz') ! s:RunDbgCmd(buf, 'breakl', ['No breakpoints defined']) ! ! s:RunDbgCmd(buf, 'cont') ! ! # Make sure the breakpoints are removed ! s:RunDbgCmd(buf, ':echo Foo()', ['19']) ! ! # Delete a non-existing breakpoint ! s:RunDbgCmd(buf, ':breakdel 2', ['E161: Breakpoint not found: 2']) ! ! # Expression breakpoint ! s:RunDbgCmd(buf, ':breakadd func 2 Bazz') ! s:RunDbgCmd(buf, ':echo Bazz(1)', [ ! 'Entering Debug mode. Type "cont" to continue.', ! 'function Bazz', ! 'line 2: let var1 = 3 + a:var']) ! s:RunDbgCmd(buf, 'step') ! s:RunDbgCmd(buf, 'step') ! s:RunDbgCmd(buf, 'breaka expr var3') ! s:RunDbgCmd(buf, 'breakl', [' 3 func Bazz line 2', \ ' 4 expr var3']) ! s:RunDbgCmd(buf, 'cont', ['Breakpoint in "Bazz" line 5', ! 'Oldval = "''another var''"', ! 'Newval = "''value2''"', ! 'function Bazz', ! 'line 5: catch']) ! ! s:RunDbgCmd(buf, 'breakdel *') ! s:RunDbgCmd(buf, 'breakl', ['No breakpoints defined']) ! ! # Check for error cases ! s:RunDbgCmd(buf, 'breakadd abcd', [ ! 'Error detected while processing function Bazz:', ! 'line 5:', ! 'E475: Invalid argument: abcd']) ! s:RunDbgCmd(buf, 'breakadd func', ['E475: Invalid argument: func']) ! s:RunDbgCmd(buf, 'breakadd func 2', ['E475: Invalid argument: func 2']) ! s:RunDbgCmd(buf, 'breaka func a()', ['E475: Invalid argument: func a()']) ! s:RunDbgCmd(buf, 'breakd abcd', ['E475: Invalid argument: abcd']) ! s:RunDbgCmd(buf, 'breakd func', ['E475: Invalid argument: func']) ! s:RunDbgCmd(buf, 'breakd func a()', ['E475: Invalid argument: func a()']) ! s:RunDbgCmd(buf, 'breakd func a', ['E161: Breakpoint not found: func a']) ! s:RunDbgCmd(buf, 'breakd expr', ['E475: Invalid argument: expr']) ! s:RunDbgCmd(buf, 'breakd expr x', ['E161: Breakpoint not found: expr x']) ! ! # finish the current function ! s:RunDbgCmd(buf, 'finish', [ ! 'function Bazz', ! 'line 8: End of function']) ! s:RunDbgCmd(buf, 'cont') ! ! # Test for :next ! s:RunDbgCmd(buf, ':debug echo Bar(1)') ! s:RunDbgCmd(buf, 'step') ! s:RunDbgCmd(buf, 'next') ! s:RunDbgCmd(buf, '', [ ! 'function Bar', ! 'line 3: return var2']) ! s:RunDbgCmd(buf, 'c') ! ! # Test for :interrupt ! s:RunDbgCmd(buf, ':debug echo Bazz(1)') ! s:RunDbgCmd(buf, 'step') ! s:RunDbgCmd(buf, 'step') ! s:RunDbgCmd(buf, 'interrupt', [ ! 'Exception thrown: Vim:Interrupt', ! 'function Bazz', ! 'line 5: catch']) ! s:RunDbgCmd(buf, 'c') ! ! # Test showing local variable in :def function ! s:RunDbgCmd(buf, ':breakadd func 2 Vim9Func') ! s:RunDbgCmd(buf, ':call Vim9Func()', ['line 2: for _ in [1, 2]']) ! s:RunDbgCmd(buf, 'next', ['line 2: for _ in [1, 2]']) ! s:RunDbgCmd(buf, 'echo cmd', ['confirm']) ! s:RunDbgCmd(buf, 'breakdel *') ! s:RunDbgCmd(buf, 'cont') ! ! # Test for :quit ! s:RunDbgCmd(buf, ':debug echo Foo()') ! s:RunDbgCmd(buf, 'breakdel *') ! s:RunDbgCmd(buf, 'breakadd func 3 Foo') ! s:RunDbgCmd(buf, 'breakadd func 3 Bazz') ! s:RunDbgCmd(buf, 'cont', [ ! 'Breakpoint in "Bazz" line 3', ! 'function Foo[2]..Bar[2]..Bazz', ! 'line 3: let var3 = "another var"']) ! s:RunDbgCmd(buf, 'quit', [ ! 'Breakpoint in "Foo" line 3', ! 'function Foo', ! 'line 3: return var2']) ! s:RunDbgCmd(buf, 'breakdel *') ! s:RunDbgCmd(buf, 'quit') ! s:RunDbgCmd(buf, 'enew! | only!') ! g:StopVimInTerminal(buf) ! enddef func Test_Debugger_breakadd() " Tests for :breakadd file and :breakadd here *************** *** 347,357 **** " Start Vim in a terminal let buf = RunVimInTerminal('XdebugBreakadd.vim', {}) ! call RunDbgCmd(buf, ':breakadd file 2 XdebugBreakadd.vim') ! call RunDbgCmd(buf, ':4 | breakadd here') ! call RunDbgCmd(buf, ':source XdebugBreakadd.vim', ['line 2: let var2 = 20']) ! call RunDbgCmd(buf, 'cont', ['line 4: let var4 = 40']) ! call RunDbgCmd(buf, 'cont') call StopVimInTerminal(buf) --- 347,357 ---- " Start Vim in a terminal let buf = RunVimInTerminal('XdebugBreakadd.vim', {}) ! call s:RunDbgCmd(buf, ':breakadd file 2 XdebugBreakadd.vim') ! call s:RunDbgCmd(buf, ':4 | breakadd here') ! call s:RunDbgCmd(buf, ':source XdebugBreakadd.vim', ['line 2: let var2 = 20']) ! call s:RunDbgCmd(buf, 'cont', ['line 4: let var4 = 40']) ! call s:RunDbgCmd(buf, 'cont') call StopVimInTerminal(buf) *************** *** 372,395 **** " Start Vim in a terminal let buf = RunVimInTerminal('XdebugBreakExpr.vim', {}) ! call RunDbgCmd(buf, ':let g:Xtest_var = 10') ! call RunDbgCmd(buf, ':breakadd expr g:Xtest_var') ! call RunDbgCmd(buf, ':source %') let expected =<< trim eval END Oldval = "10" Newval = "11" {fnamemodify('XdebugBreakExpr.vim', ':p')} line 1: let g:Xtest_var += 1 END ! call RunDbgCmd(buf, ':source %', expected) ! call RunDbgCmd(buf, 'cont') let expected =<< trim eval END Oldval = "11" Newval = "12" {fnamemodify('XdebugBreakExpr.vim', ':p')} line 1: let g:Xtest_var += 1 END ! call RunDbgCmd(buf, ':source %', expected) call StopVimInTerminal(buf) endfunc --- 372,395 ---- " Start Vim in a terminal let buf = RunVimInTerminal('XdebugBreakExpr.vim', {}) ! call s:RunDbgCmd(buf, ':let g:Xtest_var = 10') ! call s:RunDbgCmd(buf, ':breakadd expr g:Xtest_var') ! call s:RunDbgCmd(buf, ':source %') let expected =<< trim eval END Oldval = "10" Newval = "11" {fnamemodify('XdebugBreakExpr.vim', ':p')} line 1: let g:Xtest_var += 1 END ! call s:RunDbgCmd(buf, ':source %', expected) ! call s:RunDbgCmd(buf, 'cont') let expected =<< trim eval END Oldval = "11" Newval = "12" {fnamemodify('XdebugBreakExpr.vim', ':p')} line 1: let g:Xtest_var += 1 END ! call s:RunDbgCmd(buf, ':source %', expected) call StopVimInTerminal(buf) endfunc *************** *** 411,419 **** call g:TermWait(buf, g:RunningWithValgrind() ? 1000 : 50) # Despite the failure the functions are defined ! g:RunDbgCmd(buf, ':function g:EarlyFunc', ['function EarlyFunc()', 'endfunction'], {match: 'pattern'}) ! g:RunDbgCmd(buf, ':function g:LaterFunc', ['function LaterFunc()', 'endfunction'], {match: 'pattern'}) call g:StopVimInTerminal(buf) --- 411,419 ---- call g:TermWait(buf, g:RunningWithValgrind() ? 1000 : 50) # Despite the failure the functions are defined ! s:RunDbgCmd(buf, ':function g:EarlyFunc', ['function EarlyFunc()', 'endfunction'], {match: 'pattern'}) ! s:RunDbgCmd(buf, ':function g:LaterFunc', ['function LaterFunc()', 'endfunction'], {match: 'pattern'}) call g:StopVimInTerminal(buf) *************** *** 435,441 **** var buf = g:RunVimInTerminal('-S XdebugBreakRet.vim', {wait_for_ruler: 0}) call g:TermWait(buf, g:RunningWithValgrind() ? 1000 : 50) ! g:RunDbgCmd(buf, ':call GetNum()', ['line 1: return 1 + 2 + 3'], {match: 'pattern'}) call g:StopVimInTerminal(buf) --- 435,441 ---- var buf = g:RunVimInTerminal('-S XdebugBreakRet.vim', {wait_for_ruler: 0}) call g:TermWait(buf, g:RunningWithValgrind() ? 1000 : 50) ! s:RunDbgCmd(buf, ':call GetNum()', ['line 1: return 1 + 2 + 3'], {match: 'pattern'}) call g:StopVimInTerminal(buf) *************** *** 474,492 **** let buf = RunVimInTerminal('-S Xtest1.vim', {}) ! call RunDbgCmd(buf, \ ':debug call GlobalFunction()', \ ['cmd: call GlobalFunction()']) ! call RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()']) ! call RunDbgCmd(buf, 'backtrace', ['>backtrace', \ '->0 function GlobalFunction', \ 'line 1: call CallAFunction()']) ! call RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()']) ! call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) ! call RunDbgCmd(buf, 'backtrace', ['>backtrace', \ ' 2 function GlobalFunction[1]', \ ' 1 CallAFunction[1]', \ '->0 SourceAnotherFile', --- 474,492 ---- let buf = RunVimInTerminal('-S Xtest1.vim', {}) ! call s:RunDbgCmd(buf, \ ':debug call GlobalFunction()', \ ['cmd: call GlobalFunction()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()']) ! call s:RunDbgCmd(buf, 'backtrace', ['>backtrace', \ '->0 function GlobalFunction', \ 'line 1: call CallAFunction()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) ! call s:RunDbgCmd(buf, 'backtrace', ['>backtrace', \ ' 2 function GlobalFunction[1]', \ ' 1 CallAFunction[1]', \ '->0 SourceAnotherFile', *************** *** 494,501 **** " Step into the 'source' command. Note that we print the full trace all the " way though the source command. ! call RunDbgCmd(buf, 'step', ['line 1: func DoAThing()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', --- 494,501 ---- " Step into the 'source' command. Note that we print the full trace all the " way though the source command. ! call s:RunDbgCmd(buf, 'step', ['line 1: func DoAThing()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', *************** *** 503,510 **** \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()']) ! call RunDbgCmd( buf, 'up' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', --- 503,510 ---- \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()']) ! call s:RunDbgCmd( buf, 'up' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', *************** *** 512,519 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'up' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ '->2 CallAFunction[1]', --- 512,519 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'up' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ '->2 CallAFunction[1]', *************** *** 521,528 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'up' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ '->3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', --- 521,528 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'up' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ '->3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', *************** *** 530,537 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'up', [ 'frame at highest level: 3' ] ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ '->3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', --- 530,537 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'up', [ 'frame at highest level: 3' ] ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ '->3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', *************** *** 539,546 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'down' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ '->2 CallAFunction[1]', --- 539,546 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'down' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ '->2 CallAFunction[1]', *************** *** 548,555 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'down' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', --- 548,555 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'down' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', *************** *** 557,564 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'down' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', --- 557,564 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'down' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', *************** *** 566,577 **** \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'down', [ 'frame is zero' ] ) " step until we have another meaningful trace ! call RunDbgCmd(buf, 'step', ['line 5: func File2Function()']) ! call RunDbgCmd(buf, 'step', ['line 9: call File2Function()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', --- 566,577 ---- \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'down', [ 'frame is zero' ] ) " step until we have another meaningful trace ! call s:RunDbgCmd(buf, 'step', ['line 5: func File2Function()']) ! call s:RunDbgCmd(buf, 'step', ['line 9: call File2Function()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 function GlobalFunction[1]', \ ' 2 CallAFunction[1]', *************** *** 579,587 **** \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 9: call File2Function()']) ! call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) ! call RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 5 function GlobalFunction[1]', \ ' 4 CallAFunction[1]', --- 579,587 ---- \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 9: call File2Function()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 5 function GlobalFunction[1]', \ ' 4 CallAFunction[1]', *************** *** 592,610 **** \ 'line 1: echo "DoAThing"']) " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim ! call RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call RunDbgCmd(buf, 'step', ['line 10: End of sourced file']) ! call RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call RunDbgCmd(buf, 'step', ['line 2: call File2Function()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 1 function GlobalFunction[1]', \ '->0 CallAFunction', \ 'line 2: call File2Function()']) ! call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 2 function GlobalFunction[1]', \ ' 1 CallAFunction[2]', --- 592,610 ---- \ 'line 1: echo "DoAThing"']) " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim ! call s:RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call s:RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call s:RunDbgCmd(buf, 'step', ['line 10: End of sourced file']) ! call s:RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call s:RunDbgCmd(buf, 'step', ['line 2: call File2Function()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 1 function GlobalFunction[1]', \ '->0 CallAFunction', \ 'line 2: call File2Function()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 2 function GlobalFunction[1]', \ ' 1 CallAFunction[2]', *************** *** 649,677 **** let buf = RunVimInTerminal('-S Xtest1.vim', {}) ! call RunDbgCmd(buf, \ ':debug doautocmd User TestGlobalFunction', \ ['cmd: doautocmd User TestGlobalFunction']) ! call RunDbgCmd(buf, 'step', ['cmd: call GlobalFunction() | echo "Done"']) " At this point the only thing in the stack is the autocommand ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ '->0 User Autocommands for "TestGlobalFunction"', \ 'cmd: call GlobalFunction() | echo "Done"']) " And now we're back into the call stack ! call RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 1 User Autocommands for "TestGlobalFunction"', \ '->0 function GlobalFunction', \ 'line 1: call CallAFunction()']) ! call RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()']) ! call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 User Autocommands for "TestGlobalFunction"', \ ' 2 function GlobalFunction[1]', --- 649,677 ---- let buf = RunVimInTerminal('-S Xtest1.vim', {}) ! call s:RunDbgCmd(buf, \ ':debug doautocmd User TestGlobalFunction', \ ['cmd: doautocmd User TestGlobalFunction']) ! call s:RunDbgCmd(buf, 'step', ['cmd: call GlobalFunction() | echo "Done"']) " At this point the only thing in the stack is the autocommand ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ '->0 User Autocommands for "TestGlobalFunction"', \ 'cmd: call GlobalFunction() | echo "Done"']) " And now we're back into the call stack ! call s:RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 1 User Autocommands for "TestGlobalFunction"', \ '->0 function GlobalFunction', \ 'line 1: call CallAFunction()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 User Autocommands for "TestGlobalFunction"', \ ' 2 function GlobalFunction[1]', *************** *** 681,688 **** " Step into the 'source' command. Note that we print the full trace all the " way though the source command. ! call RunDbgCmd(buf, 'step', ['line 1: func DoAThing()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', --- 681,688 ---- " Step into the 'source' command. Note that we print the full trace all the " way though the source command. ! call s:RunDbgCmd(buf, 'step', ['line 1: func DoAThing()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', *************** *** 691,698 **** \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()']) ! call RunDbgCmd( buf, 'up' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', --- 691,698 ---- \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()']) ! call s:RunDbgCmd( buf, 'up' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', *************** *** 701,708 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'up' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', --- 701,708 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'up' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', *************** *** 711,718 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'up' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ '->3 function GlobalFunction[1]', --- 711,718 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'up' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ '->3 function GlobalFunction[1]', *************** *** 721,728 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'up' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ '->4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', --- 721,728 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'up' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ '->4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', *************** *** 731,738 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'up', [ 'frame at highest level: 4' ] ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ '->4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', --- 731,738 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'up', [ 'frame at highest level: 4' ] ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ '->4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', *************** *** 741,748 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'down' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ '->3 function GlobalFunction[1]', --- 741,748 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'down' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ '->3 function GlobalFunction[1]', *************** *** 752,759 **** \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'down' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', --- 752,759 ---- \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'down' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', *************** *** 762,769 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'down' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', --- 762,769 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'down' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', *************** *** 772,779 **** \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'down' ) ! call RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', --- 772,779 ---- \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'down' ) ! call s:RunDbgCmd( buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', *************** *** 782,793 **** \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call RunDbgCmd( buf, 'down', [ 'frame is zero' ] ) " step until we have another meaningful trace ! call RunDbgCmd(buf, 'step', ['line 5: func File2Function()']) ! call RunDbgCmd(buf, 'step', ['line 9: call File2Function()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', --- 782,793 ---- \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 1: func DoAThing()' ] ) ! call s:RunDbgCmd( buf, 'down', [ 'frame is zero' ] ) " step until we have another meaningful trace ! call s:RunDbgCmd(buf, 'step', ['line 5: func File2Function()']) ! call s:RunDbgCmd(buf, 'step', ['line 9: call File2Function()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 4 User Autocommands for "TestGlobalFunction"', \ ' 3 function GlobalFunction[1]', *************** *** 796,804 **** \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 9: call File2Function()']) ! call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) ! call RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 6 User Autocommands for "TestGlobalFunction"', \ ' 5 function GlobalFunction[1]', --- 796,804 ---- \ '->0 script ' .. getcwd() .. '/Xtest2.vim', \ 'line 9: call File2Function()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 6 User Autocommands for "TestGlobalFunction"', \ ' 5 function GlobalFunction[1]', *************** *** 810,829 **** \ 'line 1: echo "DoAThing"']) " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim ! call RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call RunDbgCmd(buf, 'step', ['line 10: End of sourced file']) ! call RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call RunDbgCmd(buf, 'step', ['line 2: call File2Function()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 2 User Autocommands for "TestGlobalFunction"', \ ' 1 function GlobalFunction[1]', \ '->0 CallAFunction', \ 'line 2: call File2Function()']) ! call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 User Autocommands for "TestGlobalFunction"', \ ' 2 function GlobalFunction[1]', --- 810,829 ---- \ 'line 1: echo "DoAThing"']) " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim ! call s:RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call s:RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call s:RunDbgCmd(buf, 'step', ['line 10: End of sourced file']) ! call s:RunDbgCmd(buf, 'step', ['line 1: End of function']) ! call s:RunDbgCmd(buf, 'step', ['line 2: call File2Function()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 2 User Autocommands for "TestGlobalFunction"', \ ' 1 function GlobalFunction[1]', \ '->0 CallAFunction', \ 'line 2: call File2Function()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 User Autocommands for "TestGlobalFunction"', \ ' 2 function GlobalFunction[1]', *************** *** 834,841 **** " Now unwind so that we get back to the original autocommand (and the second " cmd echo "Done") ! call RunDbgCmd(buf, 'finish', ['line 1: End of function']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 User Autocommands for "TestGlobalFunction"', \ ' 2 function GlobalFunction[1]', --- 834,841 ---- " Now unwind so that we get back to the original autocommand (and the second " cmd echo "Done") ! call s:RunDbgCmd(buf, 'finish', ['line 1: End of function']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 3 User Autocommands for "TestGlobalFunction"', \ ' 2 function GlobalFunction[1]', *************** *** 843,865 **** \ '->0 File2Function', \ 'line 1: End of function']) ! call RunDbgCmd(buf, 'finish', ['line 2: End of function']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 2 User Autocommands for "TestGlobalFunction"', \ ' 1 function GlobalFunction[1]', \ '->0 CallAFunction', \ 'line 2: End of function']) ! call RunDbgCmd(buf, 'finish', ['line 1: End of function']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 1 User Autocommands for "TestGlobalFunction"', \ '->0 function GlobalFunction', \ 'line 1: End of function']) ! call RunDbgCmd(buf, 'step', ['cmd: echo "Done"']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ '->0 User Autocommands for "TestGlobalFunction"', \ 'cmd: echo "Done"']) --- 843,865 ---- \ '->0 File2Function', \ 'line 1: End of function']) ! call s:RunDbgCmd(buf, 'finish', ['line 2: End of function']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 2 User Autocommands for "TestGlobalFunction"', \ ' 1 function GlobalFunction[1]', \ '->0 CallAFunction', \ 'line 2: End of function']) ! call s:RunDbgCmd(buf, 'finish', ['line 1: End of function']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 1 User Autocommands for "TestGlobalFunction"', \ '->0 function GlobalFunction', \ 'line 1: End of function']) ! call s:RunDbgCmd(buf, 'step', ['cmd: echo "Done"']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ '->0 User Autocommands for "TestGlobalFunction"', \ 'cmd: echo "Done"']) *************** *** 906,923 **** " Need to wait for the vim-in-terminal to be ready. " With valgrind this can take quite long. ! call CheckDbgOutput(buf, ['command line', \ 'cmd: call GlobalFunction()'], #{msec: 5000}) " At this point the only thing in the stack is the cmdline ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ '->0 command line', \ 'cmd: call GlobalFunction()']) " And now we're back into the call stack ! call RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 1 command line', \ '->0 function GlobalFunction', --- 906,923 ---- " Need to wait for the vim-in-terminal to be ready. " With valgrind this can take quite long. ! call s:CheckDbgOutput(buf, ['command line', \ 'cmd: call GlobalFunction()'], #{msec: 5000}) " At this point the only thing in the stack is the cmdline ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ '->0 command line', \ 'cmd: call GlobalFunction()']) " And now we're back into the call stack ! call s:RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '>backtrace', \ ' 1 command line', \ '->0 function GlobalFunction', *************** *** 970,1001 **** let buf = RunVimInTerminal('-S Xtest1.vim', {}) ! call RunDbgCmd(buf, \ ':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, 'echo some', ['some var']) ! call RunDbgCmd(buf, 'backtrace', [ \ '\V>backtrace', \ '\V->0 function GlobalFunction', \ '\Vline 2: CallAFunction()', \ ], \ #{match: 'pattern'}) ! call RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()']) ! call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) " Repeated line, because we first 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']) ! call RunDbgCmd(buf, 'step', ['line 1: vim9script']) ! call RunDbgCmd(buf, 'step', ['line 3: def DoAThing(): number']) ! call RunDbgCmd(buf, 'step', ['line 9: export def File2Function()']) ! call RunDbgCmd(buf, 'step', ['line 13: defcompile']) ! call RunDbgCmd(buf, 'step', ['line 14: File2Function()']) ! call RunDbgCmd(buf, 'backtrace', [ \ '\V>backtrace', \ '\V 3 function GlobalFunction[2]', \ '\V 2 \.\*_CallAFunction[1]', --- 970,1001 ---- let buf = RunVimInTerminal('-S Xtest1.vim', {}) ! call s:RunDbgCmd(buf, \ ':debug call GlobalFunction()', \ ['cmd: call GlobalFunction()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: var some = "some var"']) ! call s:RunDbgCmd(buf, 'step', ['line 2: CallAFunction()']) ! call s:RunDbgCmd(buf, 'echo some', ['some var']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '\V>backtrace', \ '\V->0 function GlobalFunction', \ '\Vline 2: CallAFunction()', \ ], \ #{match: 'pattern'}) ! call s:RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) " Repeated line, because we first are in the compiled function before the " EXEC and then in do_cmdline() before the :source command. ! call s:RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) ! call s:RunDbgCmd(buf, 'step', ['line 1: vim9script']) ! call s:RunDbgCmd(buf, 'step', ['line 3: def DoAThing(): number']) ! call s:RunDbgCmd(buf, 'step', ['line 9: export def File2Function()']) ! call s:RunDbgCmd(buf, 'step', ['line 13: defcompile']) ! call s:RunDbgCmd(buf, 'step', ['line 14: File2Function()']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '\V>backtrace', \ '\V 3 function GlobalFunction[2]', \ '\V 2 \.\*_CallAFunction[1]', *************** *** 1005,1012 **** \ #{match: 'pattern'}) " Don't step into compiled functions... ! call RunDbgCmd(buf, 'next', ['line 15: End of sourced file']) ! call RunDbgCmd(buf, 'backtrace', [ \ '\V>backtrace', \ '\V 3 function GlobalFunction[2]', \ '\V 2 \.\*_CallAFunction[1]', --- 1005,1012 ---- \ #{match: 'pattern'}) " Don't step into compiled functions... ! call s:RunDbgCmd(buf, 'next', ['line 15: End of sourced file']) ! call s:RunDbgCmd(buf, 'backtrace', [ \ '\V>backtrace', \ '\V 3 function GlobalFunction[2]', \ '\V 2 \.\*_CallAFunction[1]', *************** *** 1032,1039 **** call writefile(file3, 'Xtest3.vim', 'D') let buf = RunVimInTerminal('-S Xtest3.vim', {}) ! call RunDbgCmd(buf, ':breakadd expr g:someVar') ! call RunDbgCmd(buf, ':call g:ChangeVar()', ['Oldval = "''foo''"', 'Newval = "''bar''"', 'function ChangeVar', 'line 2: echo "changed"']) call StopVimInTerminal(buf) endfunc --- 1032,1039 ---- call writefile(file3, 'Xtest3.vim', 'D') let buf = RunVimInTerminal('-S Xtest3.vim', {}) ! call s:RunDbgCmd(buf, ':breakadd expr g:someVar') ! call s:RunDbgCmd(buf, ':call g:ChangeVar()', ['Oldval = "''foo''"', 'Newval = "''bar''"', 'function ChangeVar', 'line 2: echo "changed"']) call StopVimInTerminal(buf) endfunc *************** *** 1068,1084 **** let buf = RunVimInTerminal('-S XtestDebug.vim', {}) ! call RunDbgCmd(buf,':call SomeFunc()', ['line 2: echo "and"']) ! call RunDbgCmd(buf,'next', ['line 3: echo "there"']) ! call RunDbgCmd(buf,'next', ['line 4: breakadd func 2 LocalFunc']) " continue, next breakpoint is in LocalFunc() ! call RunDbgCmd(buf,'cont', ['line 2: echo "second"']) " continue, next breakpoint is in LegacyFunc() ! call RunDbgCmd(buf,'cont', ['line 1: echo "legone"']) ! call RunDbgCmd(buf, 'cont') call StopVimInTerminal(buf) endfunc --- 1068,1084 ---- let buf = RunVimInTerminal('-S XtestDebug.vim', {}) ! call s:RunDbgCmd(buf,':call SomeFunc()', ['line 2: echo "and"']) ! call s:RunDbgCmd(buf,'next', ['line 3: echo "there"']) ! call s:RunDbgCmd(buf,'next', ['line 4: breakadd func 2 LocalFunc']) " continue, next breakpoint is in LocalFunc() ! call s:RunDbgCmd(buf,'cont', ['line 2: echo "second"']) " continue, next breakpoint is in LegacyFunc() ! call s:RunDbgCmd(buf,'cont', ['line 1: echo "legone"']) ! call s:RunDbgCmd(buf, 'cont') call StopVimInTerminal(buf) endfunc *************** *** 1140,1207 **** let buf = RunVimInTerminal('-S Xtest.vim', {}) ! call RunDbgCmd(buf, \ ':debug call Func()', \ ['cmd: call Func()']) ! call RunDbgCmd(buf, 'next', ['result: 3']) call term_sendkeys(buf, "\r") ! call RunDbgCmd(buf, 'cont') ! 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, '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', ['function FuncWithArgs', 'line 2: for it in items']) ! call RunDbgCmd(buf, 'echo it', ['0']) ! call RunDbgCmd(buf, 'step', ['line 3: echo it']) ! call RunDbgCmd(buf, 'echo it', ['1']) ! 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', ['1']) ! 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', ['2']) ! call RunDbgCmd(buf, 'step', ['line 3: echo it']) ! call RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4: endfor']) ! call RunDbgCmd(buf, 'step', ['line 2: for it in items']) ! 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, 'step', ['line 6: def Inner()']) ! call RunDbgCmd(buf, 'cont') ! ! call RunDbgCmd(buf, ':breakadd func 1 FuncComment') ! 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, 'step', ['line 2: for i in [11, 22, 33]']) ! call RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 3: eval i + 2']) ! call RunDbgCmd(buf, 'echo i', ['11']) ! 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, 'next', ['line 3: eval i + 2']) ! call RunDbgCmd(buf, 'echo i', ['22']) ! call RunDbgCmd(buf, 'breakdel *') ! call RunDbgCmd(buf, 'cont') ! call RunDbgCmd(buf, ':breakadd func FuncWithSplitLine') ! call RunDbgCmd(buf, ':call FuncWithSplitLine()', ['function FuncWithSplitLine', 'line 1: eval 1 + 2 | eval 2 + 3']) ! call RunDbgCmd(buf, 'cont') call StopVimInTerminal(buf) endfunc --- 1140,1207 ---- let buf = RunVimInTerminal('-S Xtest.vim', {}) ! call s:RunDbgCmd(buf, \ ':debug call Func()', \ ['cmd: call Func()']) ! call s:RunDbgCmd(buf, 'next', ['result: 3']) call term_sendkeys(buf, "\r") ! call s:RunDbgCmd(buf, 'cont') ! call s:RunDbgCmd(buf, \ ':debug call FuncWithArgs("asdf", 42, 1, 2, 3)', \ ['cmd: call FuncWithArgs("asdf", 42, 1, 2, 3)']) ! call s:RunDbgCmd(buf, 'step', ['line 1: echo text .. nr']) ! call s:RunDbgCmd(buf, 'echo text', ['asdf']) ! call s:RunDbgCmd(buf, 'echo nr', ['42']) ! call s:RunDbgCmd(buf, 'echo items', ['[1, 2, 3]']) ! call s:RunDbgCmd(buf, 'step', ['asdf42', 'function FuncWithArgs', 'line 2: for it in items']) ! call s:RunDbgCmd(buf, 'step', ['function FuncWithArgs', 'line 2: for it in items']) ! call s:RunDbgCmd(buf, 'echo it', ['0']) ! call s:RunDbgCmd(buf, 'step', ['line 3: echo it']) ! call s:RunDbgCmd(buf, 'echo it', ['1']) ! call s:RunDbgCmd(buf, 'step', ['1', 'function FuncWithArgs', 'line 4: endfor']) ! call s:RunDbgCmd(buf, 'step', ['line 2: for it in items']) ! call s:RunDbgCmd(buf, 'echo it', ['1']) ! call s:RunDbgCmd(buf, 'step', ['line 3: echo it']) ! call s:RunDbgCmd(buf, 'step', ['2', 'function FuncWithArgs', 'line 4: endfor']) ! call s:RunDbgCmd(buf, 'step', ['line 2: for it in items']) ! call s:RunDbgCmd(buf, 'echo it', ['2']) ! call s:RunDbgCmd(buf, 'step', ['line 3: echo it']) ! call s:RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4: endfor']) ! call s:RunDbgCmd(buf, 'step', ['line 2: for it in items']) ! call s:RunDbgCmd(buf, 'step', ['line 5: echo "done"']) ! call s:RunDbgCmd(buf, 'cont') ! call s:RunDbgCmd(buf, \ ':debug call FuncWithDict()', \ ['cmd: call FuncWithDict()']) ! call s:RunDbgCmd(buf, 'step', ['line 1: var d = { a: 1, b: 2, }']) ! call s:RunDbgCmd(buf, 'step', ['line 6: def Inner()']) ! call s:RunDbgCmd(buf, 'cont') ! ! call s:RunDbgCmd(buf, ':breakadd func 1 FuncComment') ! call s:RunDbgCmd(buf, ':call FuncComment()', ['function FuncComment', 'line 2: echo "first" .. "one"']) ! call s:RunDbgCmd(buf, ':breakadd func 3 FuncComment') ! call s:RunDbgCmd(buf, 'cont', ['function FuncComment', 'line 5: echo "second"']) ! call s:RunDbgCmd(buf, 'cont') ! ! call s:RunDbgCmd(buf, ':breakadd func 2 FuncForLoop') ! call s:RunDbgCmd(buf, ':call FuncForLoop()', ['function FuncForLoop', 'line 2: for i in [11, 22, 33]']) ! call s:RunDbgCmd(buf, 'step', ['line 2: for i in [11, 22, 33]']) ! call s:RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 3: eval i + 2']) ! call s:RunDbgCmd(buf, 'echo i', ['11']) ! call s:RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 4: endfor']) ! call s:RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 2: for i in [11, 22, 33]']) ! call s:RunDbgCmd(buf, 'next', ['line 3: eval i + 2']) ! call s:RunDbgCmd(buf, 'echo i', ['22']) ! call s:RunDbgCmd(buf, 'breakdel *') ! call s:RunDbgCmd(buf, 'cont') ! call s:RunDbgCmd(buf, ':breakadd func FuncWithSplitLine') ! call s:RunDbgCmd(buf, ':call FuncWithSplitLine()', ['function FuncWithSplitLine', 'line 1: eval 1 + 2 | eval 2 + 3']) ! call s:RunDbgCmd(buf, 'cont') call StopVimInTerminal(buf) endfunc *************** *** 1220,1239 **** let buf = RunVimInTerminal('-S XtestLambda.vim', {}) ! call RunDbgCmd(buf, \ ':call g:Func()', \ ['function Func', 'line 2: [''b'']->map((_, v) => s)']) ! call RunDbgCmd(buf, \ 'next', \ ['function Func', 'line 3: echo "done"']) ! call RunDbgCmd(buf, 'cont') call StopVimInTerminal(buf) endfunc ! func Test_debug_backtrace_level() CheckCWD ! let lines =<< trim END let s:file1_var = 'file1' let g:global_var = 'global' --- 1220,1239 ---- let buf = RunVimInTerminal('-S XtestLambda.vim', {}) ! call s:RunDbgCmd(buf, \ ':call g:Func()', \ ['function Func', 'line 2: [''b'']->map((_, v) => s)']) ! call s:RunDbgCmd(buf, \ 'next', \ ['function Func', 'line 3: echo "done"']) ! call s:RunDbgCmd(buf, 'cont') call StopVimInTerminal(buf) endfunc ! def Test_debug_backtrace_level() CheckCWD ! var lines =<< trim END let s:file1_var = 'file1' let g:global_var = 'global' *************** *** 1246,1254 **** call s:File1Func( 'arg1' ) END ! call writefile(lines, 'Xtest1.vim', 'D') ! let lines =<< trim END let s:file2_var = 'file2' func s:File2Func( arg ) --- 1246,1254 ---- call s:File1Func( 'arg1' ) END ! writefile(lines, 'Xtest1.vim', 'D') ! lines =<< trim END let s:file2_var = 'file2' func s:File2Func( arg ) *************** *** 1259,1426 **** call s:File2Func( 'arg2' ) END ! call writefile(lines, 'Xtest2.vim', 'D') ! let file1 = getcwd() .. '/Xtest1.vim' ! let file2 = getcwd() .. '/Xtest2.vim' ! " set a breakpoint and source file1.vim ! let buf = RunVimInTerminal( ! \ '-c "breakadd file 1 Xtest1.vim" -S Xtest1.vim', ! \ #{wait_for_ruler: 0}) ! ! call CheckDbgOutput(buf, [ ! \ 'Breakpoint in "' .. file1 .. '" line 1', ! \ 'Entering Debug mode. Type "cont" to continue.', ! \ 'command line..script ' .. file1, ! \ 'line 1: let s:file1_var = ''file1''' ! \ ], #{msec: 5000}) ! ! " step through the initial declarations ! call RunDbgCmd(buf, 'step', [ 'line 2: let g:global_var = ''global''' ] ) ! call RunDbgCmd(buf, 'step', [ 'line 4: func s:File1Func( arg )' ] ) ! call RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] ) ! call RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] ) ! call RunDbgCmd(buf, 'echo global_var', [ 'global' ] ) ! ! " step in to the first function ! call RunDbgCmd(buf, 'step', [ 'line 11: call s:File1Func( ''arg1'' )' ] ) ! call RunDbgCmd(buf, 'step', [ 'line 1: let s:file1_var .= a:arg' ] ) ! call RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] ) ! call RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] ) ! call RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] ) ! call RunDbgCmd(buf, ! \'echo global_var', ! \[ 'E121: Undefined variable: global_var' ] ) ! call RunDbgCmd(buf, ! \'echo local_var', ! \[ 'E121: Undefined variable: local_var' ] ) ! call RunDbgCmd(buf, ! \'echo l:local_var', ! \[ 'E121: Undefined variable: l:local_var' ] ) ! ! " backtrace up ! call RunDbgCmd(buf, 'backtrace', [ ! \ '\V>backtrace', ! \ '\V 2 command line', ! \ '\V 1 script ' .. file1 .. '[11]', ! \ '\V->0 function \.\*_File1Func', ! \ '\Vline 1: let s:file1_var .= a:arg', ! \ ], ! \ #{ match: 'pattern' } ) ! call RunDbgCmd(buf, 'up', [ '>up' ] ) ! call RunDbgCmd(buf, 'backtrace', [ ! \ '\V>backtrace', ! \ '\V 2 command line', ! \ '\V->1 script ' .. file1 .. '[11]', ! \ '\V 0 function \.\*_File1Func', ! \ '\Vline 1: let s:file1_var .= a:arg', ! \ ], ! \ #{ match: 'pattern' } ) ! ! " Expression evaluation in the script frame (not the function frame) ! " FIXME: Unexpected in this scope (a: should not be visible) ! call RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] ) ! call RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] ) ! call RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] ) ! " FIXME: Unexpected in this scope (global should be found) ! call RunDbgCmd(buf, ! \'echo global_var', ! \[ 'E121: Undefined variable: global_var' ] ) ! call RunDbgCmd(buf, ! \'echo local_var', ! \[ 'E121: Undefined variable: local_var' ] ) ! call RunDbgCmd(buf, ! \'echo l:local_var', ! \[ 'E121: Undefined variable: l:local_var' ] ) ! ! ! " step while backtraced jumps to the latest frame ! call RunDbgCmd(buf, 'step', [ ! \ 'line 2: let local_var = s:file1_var .. '' test1''' ] ) ! call RunDbgCmd(buf, 'backtrace', [ ! \ '\V>backtrace', ! \ '\V 2 command line', ! \ '\V 1 script ' .. file1 .. '[11]', ! \ '\V->0 function \.\*_File1Func', ! \ '\Vline 2: let local_var = s:file1_var .. '' test1''', ! \ ], ! \ #{ match: 'pattern' } ) ! ! call RunDbgCmd(buf, 'step', [ 'line 3: let g:global_var .= local_var' ] ) ! call RunDbgCmd(buf, 'echo local_var', [ 'file1arg1 test1' ] ) ! call RunDbgCmd(buf, 'echo l:local_var', [ 'file1arg1 test1' ] ) ! ! call RunDbgCmd(buf, 'step', [ 'line 4: source Xtest2.vim' ] ) ! call RunDbgCmd(buf, 'step', [ 'line 1: let s:file2_var = ''file2''' ] ) ! call RunDbgCmd(buf, 'backtrace', [ ! \ '\V>backtrace', ! \ '\V 3 command line', ! \ '\V 2 script ' .. file1 .. '[11]', ! \ '\V 1 function \.\*_File1Func[4]', ! \ '\V->0 script ' .. file2, ! \ '\Vline 1: let s:file2_var = ''file2''', ! \ ], ! \ #{ match: 'pattern' } ) ! ! " Expression evaluation in the script frame file2 (not the function frame) ! call RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] ) ! call RunDbgCmd(buf, ! \ 'echo s:file1_var', ! \ [ 'E121: Undefined variable: s:file1_var' ] ) ! call RunDbgCmd(buf, 'echo g:global_var', [ 'globalfile1arg1 test1' ] ) ! call RunDbgCmd(buf, 'echo global_var', [ 'globalfile1arg1 test1' ] ) ! call RunDbgCmd(buf, ! \'echo local_var', ! \[ 'E121: Undefined variable: local_var' ] ) ! call RunDbgCmd(buf, ! \'echo l:local_var', ! \[ 'E121: Undefined variable: l:local_var' ] ) ! call RunDbgCmd(buf, ! \ 'echo s:file2_var', ! \ [ 'E121: Undefined variable: s:file2_var' ] ) ! ! call RunDbgCmd(buf, 'step', [ 'line 3: func s:File2Func( arg )' ] ) ! call RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] ) ! ! " Up the stack to the other script context ! call RunDbgCmd(buf, 'up') ! call RunDbgCmd(buf, 'backtrace', [ ! \ '\V>backtrace', ! \ '\V 3 command line', ! \ '\V 2 script ' .. file1 .. '[11]', ! \ '\V->1 function \.\*_File1Func[4]', ! \ '\V 0 script ' .. file2, ! \ '\Vline 3: func s:File2Func( arg )', ! \ ], ! \ #{ match: 'pattern' } ) ! " FIXME: Unexpected. Should see the a: and l: dicts from File1Func ! call RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] ) ! call RunDbgCmd(buf, ! \ 'echo l:local_var', ! \ [ 'E121: Undefined variable: l:local_var' ] ) ! ! call RunDbgCmd(buf, 'up') ! call RunDbgCmd(buf, 'backtrace', [ ! \ '\V>backtrace', ! \ '\V 3 command line', ! \ '\V->2 script ' .. file1 .. '[11]', ! \ '\V 1 function \.\*_File1Func[4]', ! \ '\V 0 script ' .. file2, ! \ '\Vline 3: func s:File2Func( arg )', ! \ ], ! \ #{ match: 'pattern' } ) ! ! " FIXME: Unexpected (wrong script vars are used) ! call RunDbgCmd(buf, ! \ 'echo s:file1_var', ! \ [ 'E121: Undefined variable: s:file1_var' ] ) ! call RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] ) ! ! call RunDbgCmd(buf, 'cont') ! call StopVimInTerminal(buf) ! endfunc " Test for setting a breakpoint on a :endif where the :if condition is false " and then quit the script. This should generate an interrupt. --- 1259,1426 ---- call s:File2Func( 'arg2' ) END ! writefile(lines, 'Xtest2.vim', 'D') ! var file1 = getcwd() .. '/Xtest1.vim' ! var file2 = getcwd() .. '/Xtest2.vim' ! # set a breakpoint and source file1.vim ! var buf = g:RunVimInTerminal( ! '-c "breakadd file 1 Xtest1.vim" -S Xtest1.vim', ! {wait_for_ruler: 0}) ! ! s:CheckDbgOutput(buf, [ ! 'Breakpoint in "' .. file1 .. '" line 1', ! 'Entering Debug mode. Type "cont" to continue.', ! 'command line..script ' .. file1, ! 'line 1: let s:file1_var = ''file1''' ! ], {msec: 5000}) ! ! # step through the initial declarations ! s:RunDbgCmd(buf, 'step', [ 'line 2: let g:global_var = ''global''' ] ) ! s:RunDbgCmd(buf, 'step', [ 'line 4: func s:File1Func( arg )' ] ) ! s:RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] ) ! s:RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] ) ! s:RunDbgCmd(buf, 'echo global_var', [ 'global' ] ) ! ! # step in to the first function ! s:RunDbgCmd(buf, 'step', [ 'line 11: call s:File1Func( ''arg1'' )' ] ) ! s:RunDbgCmd(buf, 'step', [ 'line 1: let s:file1_var .= a:arg' ] ) ! s:RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] ) ! s:RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] ) ! s:RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] ) ! s:RunDbgCmd(buf, ! 'echo global_var', ! [ 'E121: Undefined variable: global_var' ] ) ! s:RunDbgCmd(buf, ! 'echo local_var', ! [ 'E121: Undefined variable: local_var' ] ) ! s:RunDbgCmd(buf, ! 'echo l:local_var', ! [ 'E121: Undefined variable: l:local_var' ] ) ! ! # backtrace up ! s:RunDbgCmd(buf, 'backtrace', [ ! '\V>backtrace', ! '\V 2 command line', ! '\V 1 script ' .. file1 .. '[11]', ! '\V->0 function \.\*_File1Func', ! '\Vline 1: let s:file1_var .= a:arg', ! ], ! { match: 'pattern' } ) ! s:RunDbgCmd(buf, 'up', [ '>up' ] ) ! ! s:RunDbgCmd(buf, 'backtrace', [ ! '\V>backtrace', ! '\V 2 command line', ! '\V->1 script ' .. file1 .. '[11]', ! '\V 0 function \.\*_File1Func', ! '\Vline 1: let s:file1_var .= a:arg', ! ], ! { match: 'pattern' } ) ! ! # Expression evaluation in the script frame (not the function frame) ! # FIXME: Unexpected in this scope (a: should not be visible) ! s:RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] ) ! s:RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] ) ! s:RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] ) ! # FIXME: Unexpected in this scope (global should be found) ! s:RunDbgCmd(buf, ! 'echo global_var', ! [ 'E121: Undefined variable: global_var' ] ) ! s:RunDbgCmd(buf, ! 'echo local_var', ! [ 'E121: Undefined variable: local_var' ] ) ! s:RunDbgCmd(buf, ! 'echo l:local_var', ! [ 'E121: Undefined variable: l:local_var' ] ) ! ! ! # step while backtraced jumps to the latest frame ! s:RunDbgCmd(buf, 'step', [ ! 'line 2: let local_var = s:file1_var .. '' test1''' ] ) ! s:RunDbgCmd(buf, 'backtrace', [ ! '\V>backtrace', ! '\V 2 command line', ! '\V 1 script ' .. file1 .. '[11]', ! '\V->0 function \.\*_File1Func', ! '\Vline 2: let local_var = s:file1_var .. '' test1''', ! ], ! { match: 'pattern' } ) ! ! s:RunDbgCmd(buf, 'step', [ 'line 3: let g:global_var .= local_var' ] ) ! s:RunDbgCmd(buf, 'echo local_var', [ 'file1arg1 test1' ] ) ! s:RunDbgCmd(buf, 'echo l:local_var', [ 'file1arg1 test1' ] ) ! ! s:RunDbgCmd(buf, 'step', [ 'line 4: source Xtest2.vim' ] ) ! s:RunDbgCmd(buf, 'step', [ 'line 1: let s:file2_var = ''file2''' ] ) ! s:RunDbgCmd(buf, 'backtrace', [ ! '\V>backtrace', ! '\V 3 command line', ! '\V 2 script ' .. file1 .. '[11]', ! '\V 1 function \.\*_File1Func[4]', ! '\V->0 script ' .. file2, ! '\Vline 1: let s:file2_var = ''file2''', ! ], ! { match: 'pattern' } ) ! ! # Expression evaluation in the script frame file2 (not the function frame) ! s:RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] ) ! s:RunDbgCmd(buf, ! 'echo s:file1_var', ! [ 'E121: Undefined variable: s:file1_var' ] ) ! s:RunDbgCmd(buf, 'echo g:global_var', [ 'globalfile1arg1 test1' ] ) ! s:RunDbgCmd(buf, 'echo global_var', [ 'globalfile1arg1 test1' ] ) ! s:RunDbgCmd(buf, ! 'echo local_var', ! [ 'E121: Undefined variable: local_var' ] ) ! s:RunDbgCmd(buf, ! 'echo l:local_var', ! [ 'E121: Undefined variable: l:local_var' ] ) ! s:RunDbgCmd(buf, ! 'echo s:file2_var', ! [ 'E121: Undefined variable: s:file2_var' ] ) ! ! s:RunDbgCmd(buf, 'step', [ 'line 3: func s:File2Func( arg )' ] ) ! s:RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] ) ! ! # Up the stack to the other script context ! s:RunDbgCmd(buf, 'up') ! s:RunDbgCmd(buf, 'backtrace', [ ! '\V>backtrace', ! '\V 3 command line', ! '\V 2 script ' .. file1 .. '[11]', ! '\V->1 function \.\*_File1Func[4]', ! '\V 0 script ' .. file2, ! '\Vline 3: func s:File2Func( arg )', ! ], ! { match: 'pattern' } ) ! # FIXME: Unexpected. Should see the a: and l: dicts from File1Func ! s:RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] ) ! s:RunDbgCmd(buf, ! 'echo l:local_var', ! [ 'E121: Undefined variable: l:local_var' ] ) ! ! s:RunDbgCmd(buf, 'up') ! s:RunDbgCmd(buf, 'backtrace', [ ! '\V>backtrace', ! '\V 3 command line', ! '\V->2 script ' .. file1 .. '[11]', ! '\V 1 function \.\*_File1Func[4]', ! '\V 0 script ' .. file2, ! '\Vline 3: func s:File2Func( arg )', ! ], ! { match: 'pattern' } ) ! ! # FIXME: Unexpected (wrong script vars are used) ! s:RunDbgCmd(buf, ! 'echo s:file1_var', ! [ 'E121: Undefined variable: s:file1_var' ] ) ! s:RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] ) ! s:RunDbgCmd(buf, 'cont') ! g:StopVimInTerminal(buf) ! enddef " Test for setting a breakpoint on a :endif where the :if condition is false " and then quit the script. This should generate an interrupt. *** ../vim-9.0.1569/src/testdir/test_filetype.vim 2023-05-18 16:42:13.663307704 +0100 --- src/testdir/test_filetype.vim 2023-05-19 21:39:42.698191105 +0100 *************** *** 704,730 **** \ 'bzl': ['file.BUILD', 'BUILD'], \ } ! func CheckItems(checks) set noswapfile ! for [ft, names] in items(a:checks) for i in range(0, len(names) - 1) new try ! exe 'edit ' . fnameescape(names[i]) catch ! call assert_report('cannot edit "' . names[i] . '": ' . v:exception) endtry if &filetype == '' && &readonly ! " File exists but not able to edit it (permission denied) else ! let expected = ft == 'none' ? '' : ft ! call assert_equal(expected, &filetype, 'with file name: ' . names[i]) endif bwipe! endfor endfor set swapfile& ! endfunc func Test_filetype_detection() filetype on --- 704,732 ---- \ 'bzl': ['file.BUILD', 'BUILD'], \ } ! def CheckItems(checks: dict>) set noswapfile ! ! for [ft, names] in items(checks) for i in range(0, len(names) - 1) new try ! exe 'edit ' .. fnameescape(names[i]) catch ! assert_report('cannot edit "' .. names[i] .. '": ' .. v:exception) endtry if &filetype == '' && &readonly ! # File exists but not able to edit it (permission denied) else ! var expected = ft == 'none' ? '' : ft ! assert_equal(expected, &filetype, 'with file name: ' .. names[i]) endif bwipe! endfor endfor + set swapfile& ! enddef func Test_filetype_detection() filetype on *** ../vim-9.0.1569/src/version.c 2023-05-19 19:01:13.292413300 +0100 --- src/version.c 2023-05-19 20:25:29.017771323 +0100 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 1570, /**/ -- hundred-and-one symptoms of being an internet addict: 44. Your friends no longer send you e-mail...they just log on to your IRC channel. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///