summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-08-30 18:37:26 +0200
committerBram Moolenaar <Bram@vim.org>2019-08-30 18:37:26 +0200
commit163588005da3a240e49416093d0d0251951d60a1 (patch)
treeaecfcef01a89c3dc66b9327d6af27404b32fa9cd
parent9e67b6a6a126f401417590dedf1bd38f71bfbae4 (diff)
patch 8.1.1946: memory error when profiling a function without a script IDv8.1.1946
Problem: Memory error when profiling a function without a script ID. Solution: Check for missing script ID. (closes #4877)
-rw-r--r--src/profiler.c13
-rw-r--r--src/testdir/test_profile.vim27
-rw-r--r--src/version.c2
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 <SNR>%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()\<CR>"
+ \ .. "echo 'hello'\<CR>"
+ \ .. "endfunc\<CR>")
+ call term_sendkeys(buf, ":profile func DoSomething\<CR>")
+ call term_sendkeys(buf, ":call DoSomething()\<CR>")
+ 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
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1946,
+/**/
1945,
/**/
1944,