1296b1f28SBram Moolenaar" Test Vim profiler 2b0f94c1fSBram Moolenaar 3b46fecd3SBram Moolenaarsource check.vim 4b46fecd3SBram MoolenaarCheckFeature profile 5296b1f28SBram Moolenaar 693344c2dSBram Moolenaarsource shared.vim 716358800SBram Moolenaarsource screendump.vim 8e5ea346aSBram Moolenaarsource vim9.vim 993344c2dSBram Moolenaar 10296b1f28SBram Moolenaarfunc Test_profile_func() 11b2049903SBram Moolenaar call RunProfileFunc('func', 'let', 'let') 12b2049903SBram Moolenaar call RunProfileFunc('def', 'var', '') 13b2049903SBram Moolenaarendfunc 14b2049903SBram Moolenaar 15b2049903SBram Moolenaarfunc RunProfileFunc(command, declare, assign) 16c79745a8SBram Moolenaar let lines =<< trim [CODE] 17c79745a8SBram Moolenaar profile start Xprofile_func.log 18c79745a8SBram Moolenaar profile func Foo* 19b2049903SBram Moolenaar XXX Foo1() 20b2049903SBram Moolenaar endXXX 21b2049903SBram Moolenaar XXX Foo2() 22b2049903SBram Moolenaar DDD counter = 100 23b2049903SBram Moolenaar while counter > 0 24b2049903SBram Moolenaar AAA counter = counter - 1 25c79745a8SBram Moolenaar endwhile 26a21df1dbSBram Moolenaar sleep 1m 27b2049903SBram Moolenaar endXXX 28b2049903SBram Moolenaar XXX Foo3() 29b2049903SBram Moolenaar endXXX 30b2049903SBram Moolenaar XXX Bar() 31b2049903SBram Moolenaar endXXX 32c79745a8SBram Moolenaar call Foo1() 33c79745a8SBram Moolenaar call Foo1() 34c79745a8SBram Moolenaar profile pause 35c79745a8SBram Moolenaar call Foo1() 36c79745a8SBram Moolenaar profile continue 37c79745a8SBram Moolenaar call Foo2() 38c79745a8SBram Moolenaar call Foo3() 39c79745a8SBram Moolenaar call Bar() 40c79745a8SBram Moolenaar if !v:profiling 41c79745a8SBram Moolenaar delfunc Foo2 42c79745a8SBram Moolenaar endif 43c79745a8SBram Moolenaar delfunc Foo3 44c79745a8SBram Moolenaar [CODE] 45296b1f28SBram Moolenaar 46b2049903SBram Moolenaar call map(lines, {k, v -> substitute(v, 'XXX', a:command, '') }) 47b2049903SBram Moolenaar call map(lines, {k, v -> substitute(v, 'DDD', a:declare, '') }) 48b2049903SBram Moolenaar call map(lines, {k, v -> substitute(v, 'AAA', a:assign, '') }) 49b2049903SBram Moolenaar 50296b1f28SBram Moolenaar call writefile(lines, 'Xprofile_func.vim') 5193344c2dSBram Moolenaar call system(GetVimCommand() 521fbfe7c4SBram Moolenaar \ . ' -es --clean' 53c011a3d0SBram Moolenaar \ . ' -c "so Xprofile_func.vim"' 54c011a3d0SBram Moolenaar \ . ' -c "qall!"') 55c011a3d0SBram Moolenaar call assert_equal(0, v:shell_error) 56c011a3d0SBram Moolenaar 57296b1f28SBram Moolenaar let lines = readfile('Xprofile_func.log') 58296b1f28SBram Moolenaar 59296b1f28SBram Moolenaar " - Foo1() is called 3 times but should be reported as called twice 60296b1f28SBram Moolenaar " since one call is in between "profile pause" .. "profile continue". 61c011a3d0SBram Moolenaar " - Foo2() should come before Foo1() since Foo1() does much more work. 62296b1f28SBram Moolenaar " - Foo3() is not reported because function is deleted. 63296b1f28SBram Moolenaar " - Unlike Foo3(), Foo2() should not be deleted since there is a check 64296b1f28SBram Moolenaar " for v:profiling. 65296b1f28SBram Moolenaar " - Bar() is not reported since it does not match "profile func Foo*". 66a21df1dbSBram Moolenaar call assert_equal(31, len(lines)) 67c011a3d0SBram Moolenaar 68c011a3d0SBram Moolenaar call assert_equal('FUNCTION Foo1()', lines[0]) 69181d4f58SBram Moolenaar call assert_match('Defined:.*Xprofile_func.vim:3', lines[1]) 704c7b08f6SBram Moolenaar call assert_equal('Called 2 times', lines[2]) 714c7b08f6SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[3]) 724c7b08f6SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[4]) 734c7b08f6SBram Moolenaar call assert_equal('', lines[5]) 744c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s)', lines[6]) 754c7b08f6SBram Moolenaar call assert_equal('', lines[7]) 764c7b08f6SBram Moolenaar call assert_equal('FUNCTION Foo2()', lines[8]) 774c7b08f6SBram Moolenaar call assert_equal('Called 1 time', lines[10]) 784c7b08f6SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[11]) 794c7b08f6SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[12]) 804c7b08f6SBram Moolenaar call assert_equal('', lines[13]) 814c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s)', lines[14]) 82b2049903SBram Moolenaar call assert_match('^\s*1\s\+.*\s\(let\|var\) counter = 100$', lines[15]) 83b2049903SBram Moolenaar call assert_match('^\s*101\s\+.*\swhile counter > 0$', lines[16]) 84b2049903SBram Moolenaar call assert_match('^\s*100\s\+.*\s \(let\)\= counter = counter - 1$', lines[17]) 85b2049903SBram Moolenaar call assert_match('^\s*10[01]\s\+.*\sendwhile$', lines[18]) 86a21df1dbSBram Moolenaar call assert_match('^\s*1\s\+.\+sleep 1m$', lines[19]) 87a21df1dbSBram Moolenaar call assert_equal('', lines[20]) 88a21df1dbSBram Moolenaar call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[21]) 89a21df1dbSBram Moolenaar call assert_equal('count total (s) self (s) function', lines[22]) 90a21df1dbSBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo2()$', lines[23]) 91a21df1dbSBram Moolenaar call assert_match('^\s*2\s\+\d\+\.\d\+\s\+Foo1()$', lines[24]) 92a21df1dbSBram Moolenaar call assert_equal('', lines[25]) 93a21df1dbSBram Moolenaar call assert_equal('FUNCTIONS SORTED ON SELF TIME', lines[26]) 94a21df1dbSBram Moolenaar call assert_equal('count total (s) self (s) function', lines[27]) 95a21df1dbSBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo2()$', lines[28]) 96a21df1dbSBram Moolenaar call assert_match('^\s*2\s\+\d\+\.\d\+\s\+Foo1()$', lines[29]) 97a21df1dbSBram Moolenaar call assert_equal('', lines[30]) 98296b1f28SBram Moolenaar 99296b1f28SBram Moolenaar call delete('Xprofile_func.vim') 100296b1f28SBram Moolenaar call delete('Xprofile_func.log') 101296b1f28SBram Moolenaarendfunc 102296b1f28SBram Moolenaar 1037feb35e7SBram Moolenaarfunc Test_profile_func_with_ifelse() 104107e9cecSBram Moolenaar call Run_profile_func_with_ifelse('func', 'let') 105107e9cecSBram Moolenaar call Run_profile_func_with_ifelse('def', 'var') 106ced68a00SBram Moolenaarendfunc 107ced68a00SBram Moolenaar 108107e9cecSBram Moolenaarfunc Run_profile_func_with_ifelse(command, declare) 109c79745a8SBram Moolenaar let lines =<< trim [CODE] 110ced68a00SBram Moolenaar XXX Foo1() 111c79745a8SBram Moolenaar if 1 112ced68a00SBram Moolenaar DDD x = 0 113c79745a8SBram Moolenaar elseif 1 114ced68a00SBram Moolenaar DDD x = 1 115c79745a8SBram Moolenaar else 116ced68a00SBram Moolenaar DDD x = 2 117c79745a8SBram Moolenaar endif 118ced68a00SBram Moolenaar endXXX 119ced68a00SBram Moolenaar XXX Foo2() 120c79745a8SBram Moolenaar if 0 121ced68a00SBram Moolenaar DDD x = 0 122c79745a8SBram Moolenaar elseif 1 123ced68a00SBram Moolenaar DDD x = 1 124c79745a8SBram Moolenaar else 125ced68a00SBram Moolenaar DDD x = 2 126c79745a8SBram Moolenaar endif 127ced68a00SBram Moolenaar endXXX 128ced68a00SBram Moolenaar XXX Foo3() 129c79745a8SBram Moolenaar if 0 130ced68a00SBram Moolenaar DDD x = 0 131c79745a8SBram Moolenaar elseif 0 132ced68a00SBram Moolenaar DDD x = 1 133c79745a8SBram Moolenaar else 134ced68a00SBram Moolenaar DDD x = 2 135c79745a8SBram Moolenaar endif 136ced68a00SBram Moolenaar endXXX 137c79745a8SBram Moolenaar call Foo1() 138c79745a8SBram Moolenaar call Foo2() 139c79745a8SBram Moolenaar call Foo3() 140c79745a8SBram Moolenaar [CODE] 1417feb35e7SBram Moolenaar 142ced68a00SBram Moolenaar call map(lines, {k, v -> substitute(v, 'XXX', a:command, '') }) 143ced68a00SBram Moolenaar call map(lines, {k, v -> substitute(v, 'DDD', a:declare, '') }) 144ced68a00SBram Moolenaar 1457feb35e7SBram Moolenaar call writefile(lines, 'Xprofile_func.vim') 14693344c2dSBram Moolenaar call system(GetVimCommand() 14793344c2dSBram Moolenaar \ . ' -es -i NONE --noplugin' 1487feb35e7SBram Moolenaar \ . ' -c "profile start Xprofile_func.log"' 1497feb35e7SBram Moolenaar \ . ' -c "profile func Foo*"' 1507feb35e7SBram Moolenaar \ . ' -c "so Xprofile_func.vim"' 1517feb35e7SBram Moolenaar \ . ' -c "qall!"') 1527feb35e7SBram Moolenaar call assert_equal(0, v:shell_error) 1537feb35e7SBram Moolenaar 1547feb35e7SBram Moolenaar let lines = readfile('Xprofile_func.log') 1557feb35e7SBram Moolenaar 1567feb35e7SBram Moolenaar " - Foo1() should pass 'if' block. 1577feb35e7SBram Moolenaar " - Foo2() should pass 'elseif' block. 1587feb35e7SBram Moolenaar " - Foo3() should pass 'else' block. 1594c7b08f6SBram Moolenaar call assert_equal(57, len(lines)) 1607feb35e7SBram Moolenaar 1617feb35e7SBram Moolenaar call assert_equal('FUNCTION Foo1()', lines[0]) 1624c7b08f6SBram Moolenaar call assert_match('Defined:.*Xprofile_func.vim', lines[1]) 1634c7b08f6SBram Moolenaar call assert_equal('Called 1 time', lines[2]) 1644c7b08f6SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[3]) 1654c7b08f6SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[4]) 1664c7b08f6SBram Moolenaar call assert_equal('', lines[5]) 1674c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s)', lines[6]) 1684c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sif 1$', lines[7]) 169ced68a00SBram Moolenaar call assert_match('^\s*1\s\+.*\s \(let\|var\) x = 0$', lines[8]) 1704c7b08f6SBram Moolenaar call assert_match( '^\s\+elseif 1$', lines[9]) 171ced68a00SBram Moolenaar call assert_match( '^\s\+\(let\|var\) x = 1$', lines[10]) 1724c7b08f6SBram Moolenaar call assert_match( '^\s\+else$', lines[11]) 173ced68a00SBram Moolenaar call assert_match( '^\s\+\(let\|var\) x = 2$', lines[12]) 1744c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sendif$', lines[13]) 1754c7b08f6SBram Moolenaar call assert_equal('', lines[14]) 1764c7b08f6SBram Moolenaar call assert_equal('FUNCTION Foo2()', lines[15]) 1774c7b08f6SBram Moolenaar call assert_equal('Called 1 time', lines[17]) 1784c7b08f6SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[18]) 1794c7b08f6SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[19]) 1804c7b08f6SBram Moolenaar call assert_equal('', lines[20]) 1814c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s)', lines[21]) 1824c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sif 0$', lines[22]) 183ced68a00SBram Moolenaar call assert_match( '^\s\+\(let\|var\) x = 0$', lines[23]) 1844c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\selseif 1$', lines[24]) 185ced68a00SBram Moolenaar call assert_match('^\s*1\s\+.*\s \(let\|var\) x = 1$', lines[25]) 1864c7b08f6SBram Moolenaar call assert_match( '^\s\+else$', lines[26]) 187ced68a00SBram Moolenaar call assert_match( '^\s\+\(let\|var\) x = 2$', lines[27]) 1884c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sendif$', lines[28]) 1894c7b08f6SBram Moolenaar call assert_equal('', lines[29]) 1904c7b08f6SBram Moolenaar call assert_equal('FUNCTION Foo3()', lines[30]) 1914c7b08f6SBram Moolenaar call assert_equal('Called 1 time', lines[32]) 1924c7b08f6SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[33]) 1934c7b08f6SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[34]) 1944c7b08f6SBram Moolenaar call assert_equal('', lines[35]) 1954c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s)', lines[36]) 1964c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sif 0$', lines[37]) 197ced68a00SBram Moolenaar call assert_match( '^\s\+\(let\|var\) x = 0$', lines[38]) 1984c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\selseif 0$', lines[39]) 199ced68a00SBram Moolenaar call assert_match( '^\s\+\(let\|var\) x = 1$', lines[40]) 2004c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\selse$', lines[41]) 201ced68a00SBram Moolenaar call assert_match('^\s*1\s\+.*\s \(let\|var\) x = 2$', lines[42]) 2024c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sendif$', lines[43]) 2034c7b08f6SBram Moolenaar call assert_equal('', lines[44]) 2044c7b08f6SBram Moolenaar call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[45]) 2054c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s) function', lines[46]) 2064c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[47]) 2074c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[48]) 2084c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[49]) 2094c7b08f6SBram Moolenaar call assert_equal('', lines[50]) 2104c7b08f6SBram Moolenaar call assert_equal('FUNCTIONS SORTED ON SELF TIME', lines[51]) 2114c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s) function', lines[52]) 2124c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[53]) 2134c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[54]) 2144c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[55]) 2154c7b08f6SBram Moolenaar call assert_equal('', lines[56]) 2167feb35e7SBram Moolenaar 2177feb35e7SBram Moolenaar call delete('Xprofile_func.vim') 2187feb35e7SBram Moolenaar call delete('Xprofile_func.log') 2197feb35e7SBram Moolenaarendfunc 2207feb35e7SBram Moolenaar 2217feb35e7SBram Moolenaarfunc Test_profile_func_with_trycatch() 222107e9cecSBram Moolenaar call Run_profile_func_with_trycatch('func', 'let') 223107e9cecSBram Moolenaar call Run_profile_func_with_trycatch('def', 'var') 224c79745a8SBram Moolenaarendfunc 225107e9cecSBram Moolenaar 226107e9cecSBram Moolenaarfunc Run_profile_func_with_trycatch(command, declare) 227107e9cecSBram Moolenaar let lines =<< trim [CODE] 228107e9cecSBram Moolenaar XXX Foo1() 229107e9cecSBram Moolenaar try 230107e9cecSBram Moolenaar DDD x = 0 231107e9cecSBram Moolenaar catch 232107e9cecSBram Moolenaar DDD x = 1 233107e9cecSBram Moolenaar finally 234107e9cecSBram Moolenaar DDD x = 2 235107e9cecSBram Moolenaar endtry 236107e9cecSBram Moolenaar endXXX 237107e9cecSBram Moolenaar XXX Foo2() 238c79745a8SBram Moolenaar try 239c79745a8SBram Moolenaar throw 0 240c79745a8SBram Moolenaar catch 241107e9cecSBram Moolenaar DDD x = 1 242c79745a8SBram Moolenaar finally 243107e9cecSBram Moolenaar DDD x = 2 244c79745a8SBram Moolenaar endtry 245107e9cecSBram Moolenaar endXXX 246107e9cecSBram Moolenaar XXX Foo3() 247c79745a8SBram Moolenaar try 248c79745a8SBram Moolenaar throw 0 249c79745a8SBram Moolenaar catch 250c79745a8SBram Moolenaar throw 1 251c79745a8SBram Moolenaar finally 252107e9cecSBram Moolenaar DDD x = 2 253c79745a8SBram Moolenaar endtry 254107e9cecSBram Moolenaar endXXX 255c79745a8SBram Moolenaar call Foo1() 256c79745a8SBram Moolenaar call Foo2() 257107e9cecSBram Moolenaar let rethrown = 0 258c79745a8SBram Moolenaar try 259c79745a8SBram Moolenaar call Foo3() 260c79745a8SBram Moolenaar catch 261107e9cecSBram Moolenaar let rethrown = 1 262c79745a8SBram Moolenaar endtry 263107e9cecSBram Moolenaar if rethrown != 1 264107e9cecSBram Moolenaar " call Foo1 again so that the test fails 265107e9cecSBram Moolenaar call Foo1() 266107e9cecSBram Moolenaar endif 267c79745a8SBram Moolenaar [CODE] 2687feb35e7SBram Moolenaar 269107e9cecSBram Moolenaar call map(lines, {k, v -> substitute(v, 'XXX', a:command, '') }) 270107e9cecSBram Moolenaar call map(lines, {k, v -> substitute(v, 'DDD', a:declare, '') }) 271107e9cecSBram Moolenaar 2727feb35e7SBram Moolenaar call writefile(lines, 'Xprofile_func.vim') 27393344c2dSBram Moolenaar call system(GetVimCommand() 27493344c2dSBram Moolenaar \ . ' -es -i NONE --noplugin' 2757feb35e7SBram Moolenaar \ . ' -c "profile start Xprofile_func.log"' 2767feb35e7SBram Moolenaar \ . ' -c "profile func Foo*"' 2777feb35e7SBram Moolenaar \ . ' -c "so Xprofile_func.vim"' 2787feb35e7SBram Moolenaar \ . ' -c "qall!"') 2797feb35e7SBram Moolenaar call assert_equal(0, v:shell_error) 2807feb35e7SBram Moolenaar 2817feb35e7SBram Moolenaar let lines = readfile('Xprofile_func.log') 2827feb35e7SBram Moolenaar 2837feb35e7SBram Moolenaar " - Foo1() should pass 'try' 'finally' blocks. 2847feb35e7SBram Moolenaar " - Foo2() should pass 'catch' 'finally' blocks. 2857feb35e7SBram Moolenaar " - Foo3() should not pass 'endtry'. 2864c7b08f6SBram Moolenaar call assert_equal(57, len(lines)) 2877feb35e7SBram Moolenaar 2887feb35e7SBram Moolenaar call assert_equal('FUNCTION Foo1()', lines[0]) 2894c7b08f6SBram Moolenaar call assert_match('Defined:.*Xprofile_func.vim', lines[1]) 2904c7b08f6SBram Moolenaar call assert_equal('Called 1 time', lines[2]) 2914c7b08f6SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[3]) 2924c7b08f6SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[4]) 2934c7b08f6SBram Moolenaar call assert_equal('', lines[5]) 2944c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s)', lines[6]) 2954c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\stry$', lines[7]) 296107e9cecSBram Moolenaar call assert_match('^\s*1\s\+.*\s \(let\|var\) x = 0$', lines[8]) 2974c7b08f6SBram Moolenaar call assert_match( '^\s\+catch$', lines[9]) 298107e9cecSBram Moolenaar call assert_match( '^\s\+\(let\|var\) x = 1$', lines[10]) 2994c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sfinally$', lines[11]) 300107e9cecSBram Moolenaar call assert_match('^\s*1\s\+.*\s \(let\|var\) x = 2$', lines[12]) 3014c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sendtry$', lines[13]) 3024c7b08f6SBram Moolenaar call assert_equal('', lines[14]) 3034c7b08f6SBram Moolenaar call assert_equal('FUNCTION Foo2()', lines[15]) 3044c7b08f6SBram Moolenaar call assert_equal('Called 1 time', lines[17]) 3054c7b08f6SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[18]) 3064c7b08f6SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[19]) 3074c7b08f6SBram Moolenaar call assert_equal('', lines[20]) 3084c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s)', lines[21]) 3094c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\stry$', lines[22]) 3104c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\s throw 0$', lines[23]) 3114c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\scatch$', lines[24]) 312107e9cecSBram Moolenaar call assert_match('^\s*1\s\+.*\s \(let\|var\) x = 1$', lines[25]) 3134c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sfinally$', lines[26]) 314107e9cecSBram Moolenaar call assert_match('^\s*1\s\+.*\s \(let\|var\) x = 2$', lines[27]) 3154c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sendtry$', lines[28]) 3164c7b08f6SBram Moolenaar call assert_equal('', lines[29]) 3174c7b08f6SBram Moolenaar call assert_equal('FUNCTION Foo3()', lines[30]) 3184c7b08f6SBram Moolenaar call assert_equal('Called 1 time', lines[32]) 3194c7b08f6SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[33]) 3204c7b08f6SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[34]) 3214c7b08f6SBram Moolenaar call assert_equal('', lines[35]) 3224c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s)', lines[36]) 3234c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\stry$', lines[37]) 3244c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\s throw 0$', lines[38]) 3254c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\scatch$', lines[39]) 3264c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\s throw 1$', lines[40]) 3274c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+.*\sfinally$', lines[41]) 328107e9cecSBram Moolenaar call assert_match('^\s*1\s\+.*\s \(let\|var\) x = 2$', lines[42]) 3294c7b08f6SBram Moolenaar call assert_match( '^\s\+endtry$', lines[43]) 3304c7b08f6SBram Moolenaar call assert_equal('', lines[44]) 3314c7b08f6SBram Moolenaar call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[45]) 3324c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s) function', lines[46]) 3334c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[47]) 3344c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[48]) 3354c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[49]) 3364c7b08f6SBram Moolenaar call assert_equal('', lines[50]) 3374c7b08f6SBram Moolenaar call assert_equal('FUNCTIONS SORTED ON SELF TIME', lines[51]) 3384c7b08f6SBram Moolenaar call assert_equal('count total (s) self (s) function', lines[52]) 3394c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[53]) 3404c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[54]) 3414c7b08f6SBram Moolenaar call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$', lines[55]) 3424c7b08f6SBram Moolenaar call assert_equal('', lines[56]) 3437feb35e7SBram Moolenaar 3447feb35e7SBram Moolenaar call delete('Xprofile_func.vim') 3457feb35e7SBram Moolenaar call delete('Xprofile_func.log') 3467feb35e7SBram Moolenaarendfunc 3477feb35e7SBram Moolenaar 348296b1f28SBram Moolenaarfunc Test_profile_file() 349c79745a8SBram Moolenaar let lines =<< trim [CODE] 350c79745a8SBram Moolenaar func! Foo() 351c79745a8SBram Moolenaar endfunc 352c79745a8SBram Moolenaar for i in range(10) 353c79745a8SBram Moolenaar " a comment 354c79745a8SBram Moolenaar call Foo() 355c79745a8SBram Moolenaar endfor 356c79745a8SBram Moolenaar call Foo() 357c79745a8SBram Moolenaar [CODE] 358296b1f28SBram Moolenaar 359296b1f28SBram Moolenaar call writefile(lines, 'Xprofile_file.vim') 36093344c2dSBram Moolenaar call system(GetVimCommandClean() 36193344c2dSBram Moolenaar \ . ' -es' 362c011a3d0SBram Moolenaar \ . ' -c "profile start Xprofile_file.log"' 363c011a3d0SBram Moolenaar \ . ' -c "profile file Xprofile_file.vim"' 364c011a3d0SBram Moolenaar \ . ' -c "so Xprofile_file.vim"' 365c011a3d0SBram Moolenaar \ . ' -c "so Xprofile_file.vim"' 366c011a3d0SBram Moolenaar \ . ' -c "qall!"') 367c011a3d0SBram Moolenaar call assert_equal(0, v:shell_error) 368296b1f28SBram Moolenaar 369296b1f28SBram Moolenaar let lines = readfile('Xprofile_file.log') 370296b1f28SBram Moolenaar 371296b1f28SBram Moolenaar call assert_equal(14, len(lines)) 372296b1f28SBram Moolenaar 373296b1f28SBram Moolenaar call assert_match('^SCRIPT .*Xprofile_file.vim$', lines[0]) 374296b1f28SBram Moolenaar call assert_equal('Sourced 2 times', lines[1]) 375296b1f28SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[2]) 376296b1f28SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3]) 377296b1f28SBram Moolenaar call assert_equal('', lines[4]) 378296b1f28SBram Moolenaar call assert_equal('count total (s) self (s)', lines[5]) 37967435d99SBram Moolenaar call assert_match(' 2 0.\d\+ func! Foo()', lines[6]) 380296b1f28SBram Moolenaar call assert_equal(' endfunc', lines[7]) 381296b1f28SBram Moolenaar " Loop iterates 10 times. Since script runs twice, body executes 20 times. 382296b1f28SBram Moolenaar " First line of loop executes one more time than body to detect end of loop. 383296b1f28SBram Moolenaar call assert_match('^\s*22\s\+\d\+\.\d\+\s\+for i in range(10)$', lines[8]) 384296b1f28SBram Moolenaar call assert_equal(' " a comment', lines[9]) 385d21b16f3SBram Moolenaar " if self and total are equal we only get one number 386d21b16f3SBram Moolenaar call assert_match('^\s*20\s\+\(\d\+\.\d\+\s\+\)\=\d\+\.\d\+\s\+call Foo()$', lines[10]) 3877feb35e7SBram Moolenaar call assert_match('^\s*22\s\+\d\+\.\d\+\s\+endfor$', lines[11]) 388e32bbdedSBram Moolenaar " if self and total are equal we only get one number 389e32bbdedSBram Moolenaar call assert_match('^\s*2\s\+\(\d\+\.\d\+\s\+\)\=\d\+\.\d\+\s\+call Foo()$', lines[12]) 390296b1f28SBram Moolenaar call assert_equal('', lines[13]) 391296b1f28SBram Moolenaar 392296b1f28SBram Moolenaar call delete('Xprofile_file.vim') 393296b1f28SBram Moolenaar call delete('Xprofile_file.log') 394296b1f28SBram Moolenaarendfunc 395296b1f28SBram Moolenaar 39667435d99SBram Moolenaarfunc Test_profile_file_with_cont() 39767435d99SBram Moolenaar let lines = [ 39867435d99SBram Moolenaar \ 'echo "hello', 39967435d99SBram Moolenaar \ ' \ world"', 40067435d99SBram Moolenaar \ 'echo "foo ', 40167435d99SBram Moolenaar \ ' \bar"', 40267435d99SBram Moolenaar \ ] 40367435d99SBram Moolenaar 40467435d99SBram Moolenaar call writefile(lines, 'Xprofile_file.vim') 40593344c2dSBram Moolenaar call system(GetVimCommandClean() 40693344c2dSBram Moolenaar \ . ' -es' 40767435d99SBram Moolenaar \ . ' -c "profile start Xprofile_file.log"' 40867435d99SBram Moolenaar \ . ' -c "profile file Xprofile_file.vim"' 40967435d99SBram Moolenaar \ . ' -c "so Xprofile_file.vim"' 41067435d99SBram Moolenaar \ . ' -c "qall!"') 41167435d99SBram Moolenaar call assert_equal(0, v:shell_error) 41267435d99SBram Moolenaar 41367435d99SBram Moolenaar let lines = readfile('Xprofile_file.log') 41467435d99SBram Moolenaar call assert_equal(11, len(lines)) 41567435d99SBram Moolenaar 41667435d99SBram Moolenaar call assert_match('^SCRIPT .*Xprofile_file.vim$', lines[0]) 41767435d99SBram Moolenaar call assert_equal('Sourced 1 time', lines[1]) 41867435d99SBram Moolenaar call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[2]) 41967435d99SBram Moolenaar call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3]) 42067435d99SBram Moolenaar call assert_equal('', lines[4]) 42167435d99SBram Moolenaar call assert_equal('count total (s) self (s)', lines[5]) 42267435d99SBram Moolenaar call assert_match(' 1 0.\d\+ echo "hello', lines[6]) 42367435d99SBram Moolenaar call assert_equal(' \ world"', lines[7]) 42467435d99SBram Moolenaar call assert_match(' 1 0.\d\+ echo "foo ', lines[8]) 42567435d99SBram Moolenaar call assert_equal(' \bar"', lines[9]) 42667435d99SBram Moolenaar call assert_equal('', lines[10]) 42767435d99SBram Moolenaar 42867435d99SBram Moolenaar call delete('Xprofile_file.vim') 42967435d99SBram Moolenaar call delete('Xprofile_file.log') 43067435d99SBram Moolenaarendfunc 43167435d99SBram Moolenaar 432296b1f28SBram Moolenaarfunc Test_profile_completion() 433296b1f28SBram Moolenaar call feedkeys(":profile \<C-A>\<C-B>\"\<CR>", 'tx') 434296b1f28SBram Moolenaar call assert_equal('"profile continue file func pause start', @:) 435296b1f28SBram Moolenaar 436296b1f28SBram Moolenaar call feedkeys(":profile start test_prof\<C-A>\<C-B>\"\<CR>", 'tx') 437296b1f28SBram Moolenaar call assert_match('^"profile start.* test_profile\.vim', @:) 438296b1f28SBram Moolenaarendfunc 439296b1f28SBram Moolenaar 440296b1f28SBram Moolenaarfunc Test_profile_errors() 441296b1f28SBram Moolenaar call assert_fails("profile func Foo", 'E750:') 442296b1f28SBram Moolenaar call assert_fails("profile pause", 'E750:') 443296b1f28SBram Moolenaar call assert_fails("profile continue", 'E750:') 444296b1f28SBram Moolenaarendfunc 445ac112f01SBram Moolenaar 446ac112f01SBram Moolenaarfunc Test_profile_truncate_mbyte() 44730276f2bSBram Moolenaar if &enc !=# 'utf-8' 448ac112f01SBram Moolenaar return 449ac112f01SBram Moolenaar endif 450ac112f01SBram Moolenaar 451ac112f01SBram Moolenaar let lines = [ 452ac112f01SBram Moolenaar \ 'scriptencoding utf-8', 453ac112f01SBram Moolenaar \ 'func! Foo()', 454ac112f01SBram Moolenaar \ ' return [', 455ac112f01SBram Moolenaar \ ' \ "' . join(map(range(0x4E00, 0x4E00 + 340), 'nr2char(v:val)'), '') . '",', 456ac112f01SBram Moolenaar \ ' \ "' . join(map(range(0x4F00, 0x4F00 + 340), 'nr2char(v:val)'), '') . '",', 457ac112f01SBram Moolenaar \ ' \ ]', 458ac112f01SBram Moolenaar \ 'endfunc', 459ac112f01SBram Moolenaar \ 'call Foo()', 460ac112f01SBram Moolenaar \ ] 461ac112f01SBram Moolenaar 462ac112f01SBram Moolenaar call writefile(lines, 'Xprofile_file.vim') 46393344c2dSBram Moolenaar call system(GetVimCommandClean() 46493344c2dSBram Moolenaar \ . ' -es --cmd "set enc=utf-8"' 465ac112f01SBram Moolenaar \ . ' -c "profile start Xprofile_file.log"' 466ac112f01SBram Moolenaar \ . ' -c "profile file Xprofile_file.vim"' 467ac112f01SBram Moolenaar \ . ' -c "so Xprofile_file.vim"' 468ac112f01SBram Moolenaar \ . ' -c "qall!"') 469ac112f01SBram Moolenaar call assert_equal(0, v:shell_error) 470ac112f01SBram Moolenaar 471ac112f01SBram Moolenaar split Xprofile_file.log 472ac112f01SBram Moolenaar if &fenc != '' 473ac112f01SBram Moolenaar call assert_equal('utf-8', &fenc) 474ac112f01SBram Moolenaar endif 475ac112f01SBram Moolenaar /func! Foo() 476ac112f01SBram Moolenaar let lnum = line('.') 477ac112f01SBram Moolenaar call assert_match('^\s*return \[$', getline(lnum + 1)) 478ac112f01SBram Moolenaar call assert_match("\u4F52$", getline(lnum + 2)) 479ac112f01SBram Moolenaar call assert_match("\u5052$", getline(lnum + 3)) 480ac112f01SBram Moolenaar call assert_match('^\s*\\ \]$', getline(lnum + 4)) 481ac112f01SBram Moolenaar bwipe! 482ac112f01SBram Moolenaar 483ac112f01SBram Moolenaar call delete('Xprofile_file.vim') 484ac112f01SBram Moolenaar call delete('Xprofile_file.log') 485ac112f01SBram Moolenaarendfunc 4861fbfe7c4SBram Moolenaar 4871fbfe7c4SBram Moolenaarfunc Test_profdel_func() 488c79745a8SBram Moolenaar let lines =<< trim [CODE] 489c79745a8SBram Moolenaar profile start Xprofile_file.log 490c79745a8SBram Moolenaar func! Foo1() 491c79745a8SBram Moolenaar endfunc 492c79745a8SBram Moolenaar func! Foo2() 493c79745a8SBram Moolenaar endfunc 494c79745a8SBram Moolenaar func! Foo3() 495c79745a8SBram Moolenaar endfunc 496c79745a8SBram Moolenaar 497c79745a8SBram Moolenaar profile func Foo1 498c79745a8SBram Moolenaar profile func Foo2 499c79745a8SBram Moolenaar call Foo1() 500c79745a8SBram Moolenaar call Foo2() 501c79745a8SBram Moolenaar 502c79745a8SBram Moolenaar profile func Foo3 503c79745a8SBram Moolenaar profdel func Foo2 504c79745a8SBram Moolenaar profdel func Foo3 505c79745a8SBram Moolenaar call Foo1() 506c79745a8SBram Moolenaar call Foo2() 507c79745a8SBram Moolenaar call Foo3() 508c79745a8SBram Moolenaar [CODE] 5091fbfe7c4SBram Moolenaar call writefile(lines, 'Xprofile_file.vim') 51093344c2dSBram Moolenaar call system(GetVimCommandClean() . ' -es -c "so Xprofile_file.vim" -c q') 5111fbfe7c4SBram Moolenaar call assert_equal(0, v:shell_error) 5121fbfe7c4SBram Moolenaar 5131fbfe7c4SBram Moolenaar let lines = readfile('Xprofile_file.log') 5144c7b08f6SBram Moolenaar call assert_equal(26, len(lines)) 5151fbfe7c4SBram Moolenaar 5161fbfe7c4SBram Moolenaar " Check that: 5171fbfe7c4SBram Moolenaar " - Foo1() is called twice (profdel not invoked) 5181fbfe7c4SBram Moolenaar " - Foo2() is called once (profdel invoked after it was called) 5191fbfe7c4SBram Moolenaar " - Foo3() is not called (profdel invoked before it was called) 5201fbfe7c4SBram Moolenaar call assert_equal('FUNCTION Foo1()', lines[0]) 5214c7b08f6SBram Moolenaar call assert_match('Defined:.*Xprofile_file.vim', lines[1]) 5224c7b08f6SBram Moolenaar call assert_equal('Called 2 times', lines[2]) 5234c7b08f6SBram Moolenaar call assert_equal('FUNCTION Foo2()', lines[8]) 5244c7b08f6SBram Moolenaar call assert_equal('Called 1 time', lines[10]) 5254c7b08f6SBram Moolenaar call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[16]) 5264c7b08f6SBram Moolenaar call assert_equal('FUNCTIONS SORTED ON SELF TIME', lines[21]) 5271fbfe7c4SBram Moolenaar 5281fbfe7c4SBram Moolenaar call delete('Xprofile_file.vim') 5291fbfe7c4SBram Moolenaar call delete('Xprofile_file.log') 5301fbfe7c4SBram Moolenaarendfunc 5311fbfe7c4SBram Moolenaar 5321fbfe7c4SBram Moolenaarfunc Test_profdel_star() 5331fbfe7c4SBram Moolenaar " Foo() is invoked once before and once after 'profdel *'. 5341fbfe7c4SBram Moolenaar " So profiling should report it only once. 535c79745a8SBram Moolenaar let lines =<< trim [CODE] 536c79745a8SBram Moolenaar profile start Xprofile_file.log 537c79745a8SBram Moolenaar func! Foo() 538c79745a8SBram Moolenaar endfunc 539c79745a8SBram Moolenaar profile func Foo 540c79745a8SBram Moolenaar call Foo() 541c79745a8SBram Moolenaar profdel * 542c79745a8SBram Moolenaar call Foo() 543c79745a8SBram Moolenaar [CODE] 5441fbfe7c4SBram Moolenaar call writefile(lines, 'Xprofile_file.vim') 54593344c2dSBram Moolenaar call system(GetVimCommandClean() . ' -es -c "so Xprofile_file.vim" -c q') 5461fbfe7c4SBram Moolenaar call assert_equal(0, v:shell_error) 5471fbfe7c4SBram Moolenaar 5481fbfe7c4SBram Moolenaar let lines = readfile('Xprofile_file.log') 5494c7b08f6SBram Moolenaar call assert_equal(16, len(lines)) 5501fbfe7c4SBram Moolenaar 5511fbfe7c4SBram Moolenaar call assert_equal('FUNCTION Foo()', lines[0]) 5524c7b08f6SBram Moolenaar call assert_match('Defined:.*Xprofile_file.vim', lines[1]) 5534c7b08f6SBram Moolenaar call assert_equal('Called 1 time', lines[2]) 5544c7b08f6SBram Moolenaar call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[8]) 5554c7b08f6SBram Moolenaar call assert_equal('FUNCTIONS SORTED ON SELF TIME', lines[12]) 5561fbfe7c4SBram Moolenaar 5571fbfe7c4SBram Moolenaar call delete('Xprofile_file.vim') 5581fbfe7c4SBram Moolenaar call delete('Xprofile_file.log') 5591fbfe7c4SBram Moolenaarendfunc 56016358800SBram Moolenaar 56116358800SBram Moolenaar" When typing the function it won't have a script ID, test that this works. 56216358800SBram Moolenaarfunc Test_profile_typed_func() 56316358800SBram Moolenaar CheckScreendump 56416358800SBram Moolenaar 56516358800SBram Moolenaar let lines =<< trim END 56616358800SBram Moolenaar profile start XprofileTypedFunc 56716358800SBram Moolenaar END 56816358800SBram Moolenaar call writefile(lines, 'XtestProfile') 56916358800SBram Moolenaar let buf = RunVimInTerminal('-S XtestProfile', #{}) 57016358800SBram Moolenaar 57116358800SBram Moolenaar call term_sendkeys(buf, ":func DoSomething()\<CR>" 57216358800SBram Moolenaar \ .. "echo 'hello'\<CR>" 57316358800SBram Moolenaar \ .. "endfunc\<CR>") 57416358800SBram Moolenaar call term_sendkeys(buf, ":profile func DoSomething\<CR>") 57516358800SBram Moolenaar call term_sendkeys(buf, ":call DoSomething()\<CR>") 5766a2c5a7dSBram Moolenaar call TermWait(buf, 100) 57716358800SBram Moolenaar call StopVimInTerminal(buf) 57816358800SBram Moolenaar let lines = readfile('XprofileTypedFunc') 57916358800SBram Moolenaar call assert_equal("FUNCTION DoSomething()", lines[0]) 58016358800SBram Moolenaar call assert_equal("Called 1 time", lines[1]) 58116358800SBram Moolenaar 58216358800SBram Moolenaar " clean up 58316358800SBram Moolenaar call delete('XprofileTypedFunc') 58416358800SBram Moolenaar call delete('XtestProfile') 58516358800SBram Moolenaarendfunc 5866d91bcb4SBram Moolenaar 587e5ea346aSBram Moolenaarfunc Test_vim9_profiling() 588e5ea346aSBram Moolenaar " only tests that compiling and calling functions doesn't crash 589e5ea346aSBram Moolenaar let lines =<< trim END 590e5ea346aSBram Moolenaar vim9script 591e5ea346aSBram Moolenaar def Func() 592e5ea346aSBram Moolenaar Crash() 593e5ea346aSBram Moolenaar enddef 594e5ea346aSBram Moolenaar def Crash() 595e5ea346aSBram Moolenaar enddef 59698989a00SBram Moolenaar prof start Xprofile_crash.log 597e5ea346aSBram Moolenaar prof func Func 598e5ea346aSBram Moolenaar Func() 599e5ea346aSBram Moolenaar END 60098989a00SBram Moolenaar call writefile(lines, 'Xprofile_crash.vim') 60198989a00SBram Moolenaar call system(GetVimCommandClean() . ' -es -c "so Xprofile_crash.vim" -c q') 60298989a00SBram Moolenaar call assert_equal(0, v:shell_error) 603*8c801b37SBram Moolenaar call assert_true(readfile('Xprofile_crash.log')->len() > 10) 60498989a00SBram Moolenaar call delete('Xprofile_crash.vim') 60598989a00SBram Moolenaar call delete('Xprofile_crash.log') 606e5ea346aSBram Moolenaarendfunc 607e5ea346aSBram Moolenaar 60812d26531SBram Moolenaarfunc Test_vim9_nested_call() 60912d26531SBram Moolenaar let lines =<< trim END 61012d26531SBram Moolenaar vim9script 61112d26531SBram Moolenaar var total = 0 61212d26531SBram Moolenaar def One(Ref: func(number)) 61312d26531SBram Moolenaar for i in range(3) 61412d26531SBram Moolenaar Ref(i) 61512d26531SBram Moolenaar endfor 61612d26531SBram Moolenaar enddef 61712d26531SBram Moolenaar def Two(nr: number) 61812d26531SBram Moolenaar total += nr 61912d26531SBram Moolenaar enddef 62012d26531SBram Moolenaar prof start Xprofile_nested.log 62112d26531SBram Moolenaar prof func One 62212d26531SBram Moolenaar prof func Two 62312d26531SBram Moolenaar One((nr) => Two(nr)) 62412d26531SBram Moolenaar assert_equal(3, total) 62512d26531SBram Moolenaar END 62612d26531SBram Moolenaar call writefile(lines, 'Xprofile_nested.vim') 62712d26531SBram Moolenaar call system(GetVimCommandClean() . ' -es -c "so Xprofile_nested.vim" -c q') 62812d26531SBram Moolenaar call assert_equal(0, v:shell_error) 62912d26531SBram Moolenaar 63012d26531SBram Moolenaar let prof_lines = readfile('Xprofile_nested.log')->join('#') 63112d26531SBram Moolenaar call assert_match('FUNCTION <SNR>\d\+_One().*' 63212d26531SBram Moolenaar \ .. '#Called 1 time.*' 63312d26531SBram Moolenaar \ .. '# 1 \s*[0-9.]\+ for i in range(3)' 63412d26531SBram Moolenaar \ .. '# 3 \s*[0-9.]\+ \s*[0-9.]\+ Ref(i)' 63512d26531SBram Moolenaar \ .. '# 3 \s*[0-9.]\+ endfor', prof_lines) 63612d26531SBram Moolenaar call assert_match('FUNCTION <SNR>\d\+_Two().*' 63712d26531SBram Moolenaar \ .. '#Called 3 times.*' 63812d26531SBram Moolenaar \ .. '# 3 \s*[0-9.]\+ total += nr', prof_lines) 6394fa11757SBram Moolenaar call delete('Xprofile_nested.vim') 6404fa11757SBram Moolenaar call delete('Xprofile_nested.log') 64112d26531SBram Moolenaarendfunc 64212d26531SBram Moolenaar 643e5ea346aSBram Moolenaar 6446d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 645