From 163588005da3a240e49416093d0d0251951d60a1 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Fri, 30 Aug 2019 18:37:26 +0200 Subject: [PATCH] patch 8.1.1946: memory error when profiling a function without a script ID Problem: Memory error when profiling a function without a script ID. Solution: Check for missing script ID. (closes #4877) --- src/profiler.c | 13 ++++++++----- src/testdir/test_profile.vim | 27 +++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/profiler.c b/src/profiler.c index 64ee0edec3..d7d010f79f 100644 --- a/src/profiler.c +++ b/src/profiler.c @@ -690,13 +690,16 @@ func_dump_profile(FILE *fd) fprintf(fd, "FUNCTION %s()\n", fp->uf_name + 3); else fprintf(fd, "FUNCTION %s()\n", fp->uf_name); - p = home_replace_save(NULL, - get_scriptname(fp->uf_script_ctx.sc_sid)); - if (p != NULL) + if (fp->uf_script_ctx.sc_sid > 0) { - fprintf(fd, " Defined: %s line %ld\n", + p = home_replace_save(NULL, + get_scriptname(fp->uf_script_ctx.sc_sid)); + if (p != NULL) + { + fprintf(fd, " Defined: %s line %ld\n", p, (long)fp->uf_script_ctx.sc_lnum); - vim_free(p); + vim_free(p); + } } if (fp->uf_tm_count == 1) fprintf(fd, "Called 1 time\n"); diff --git a/src/testdir/test_profile.vim b/src/testdir/test_profile.vim index c7f515a893..d0546df865 100644 --- a/src/testdir/test_profile.vim +++ b/src/testdir/test_profile.vim @@ -4,6 +4,7 @@ source check.vim CheckFeature profile source shared.vim +source screendump.vim func Test_profile_func() let lines =<< trim [CODE] @@ -522,3 +523,29 @@ 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() + CheckScreendump + + 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 diff --git a/src/version.c b/src/version.c index 5bde641b4d..26587aaaec 100644 --- a/src/version.c +++ b/src/version.c @@ -761,6 +761,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1946, /**/ 1945, /**/