]> granicus.if.org Git - vim/commitdiff
patch 8.1.1946: memory error when profiling a function without a script ID v8.1.1946
authorBram Moolenaar <Bram@vim.org>
Fri, 30 Aug 2019 16:37:26 +0000 (18:37 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 30 Aug 2019 16:37:26 +0000 (18:37 +0200)
Problem:    Memory error when profiling a function without a script ID.
Solution:   Check for missing script ID.  (closes #4877)

src/profiler.c
src/testdir/test_profile.vim
src/version.c

index 64ee0edec3802ca9acf96b1ba6015660ffb2b5c8..d7d010f79fcfb08fb35678fb0fa717096fffa5bb 100644 (file)
@@ -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");
index c7f515a8939ffde2526433a4238ae1670b972db4..d0546df865d9e5081b5716045c248a9b91343b20 100644 (file)
@@ -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
index 5bde641b4d75b6d8553c9089a5ae5905685ffa5b..26587aaaecb1cce623dd5913dd3c6bc19a8f36d6 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1946,
 /**/
     1945,
 /**/