diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 6f7d5ed6e4..98448ff1f9 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -22147,16 +22147,18 @@ void func_dump_profile(FILE *fd) } else { fprintf(fd, "FUNCTION %s()\n", fp->uf_name); } - bool should_free; - const LastSet last_set = (LastSet){ - .script_ctx = fp->uf_script_ctx, - .channel_id = 0, - }; - char_u *p = get_scriptname(last_set, &should_free); - fprintf(fd, " Defined: %s line %" PRIdLINENR "\n", - p, fp->uf_script_ctx.sc_lnum); - if (should_free) { - xfree(p); + if (fp->uf_script_ctx.sc_sid != 0) { + bool should_free; + const LastSet last_set = (LastSet){ + .script_ctx = fp->uf_script_ctx, + .channel_id = 0, + }; + char_u *p = get_scriptname(last_set, &should_free); + fprintf(fd, " Defined: %s line %" PRIdLINENR "\n", + p, fp->uf_script_ctx.sc_lnum); + if (should_free) { + xfree(p); + } } if (fp->uf_tm_count == 1) { fprintf(fd, "Called 1 time\n"); diff --git a/src/nvim/testdir/screendump.vim b/src/nvim/testdir/screendump.vim new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim index ffd344200b..f4f5cbca61 100644 --- a/src/nvim/testdir/test_options.vim +++ b/src/nvim/testdir/test_options.vim @@ -216,7 +216,7 @@ func Test_set_completion() " Expand files and directories. call feedkeys(":set tags=./\\\"\", 'tx') - call assert_match('./samples/ ./sautest/ ./setup.vim ./shared.vim', @:) + call assert_match('./samples/ ./sautest/ ./screendump.vim ./setup.vim ./shared.vim', @:) call feedkeys(":set tags=./\\\\ dif\\\"\", 'tx') call assert_equal('"set tags=./\\ diff diffexpr diffopt', @:) diff --git a/src/nvim/testdir/test_profile.vim b/src/nvim/testdir/test_profile.vim index 4037095ae5..7e853eeac3 100644 --- a/src/nvim/testdir/test_profile.vim +++ b/src/nvim/testdir/test_profile.vim @@ -3,6 +3,8 @@ if !has('profile') finish endif +source screendump.vim + func Test_profile_func() let lines = [ \ 'profile start Xprofile_func.log', @@ -518,3 +520,31 @@ func Test_profdel_star() call delete('Xprofile_file.vim') call delete('Xprofile_file.log') endfunc + +" When typing the function it won't have a script ID, test that this works. +func Test_profile_typed_func() + if !CanRunVimInTerminal() + throw 'Skipped: cannot run Vim in a terminal window' + endif + + let lines =<< trim END + profile start XprofileTypedFunc + END + call writefile(lines, 'XtestProfile') + let buf = RunVimInTerminal('-S XtestProfile', #{}) + + call term_sendkeys(buf, ":func DoSomething()\" + \ .. "echo 'hello'\" + \ .. "endfunc\") + call term_sendkeys(buf, ":profile func DoSomething\") + call term_sendkeys(buf, ":call DoSomething()\") + call term_wait(buf, 200) + call StopVimInTerminal(buf) + let lines = readfile('XprofileTypedFunc') + call assert_equal("FUNCTION DoSomething()", lines[0]) + call assert_equal("Called 1 time", lines[1]) + + " clean up + call delete('XprofileTypedFunc') + call delete('XtestProfile') +endfunc