summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-10-19 21:04:37 +0200
committerBram Moolenaar <Bram@vim.org>2017-10-19 21:04:37 +0200
commit67435d9983965c5c77fc74f0559779ce4554dacb (patch)
treeff45ed1b00544acfd9c6b1aac58eceff561e70bf
parentfafcf0dd59fd9c4ef743bb333ae40d1d322b6079 (diff)
downloadvim-git-67435d9983965c5c77fc74f0559779ce4554dacb.tar.gz
patch 8.0.1207: profiling skips the first and last script linev8.0.1207
Problem: Profiling skips the first and last script line. Solution: Check for BOM after setting script ID. (Lemonboy, closes #2103, closes #2112) Add a test. List the trailing script lines.
-rw-r--r--src/ex_cmds2.c57
-rw-r--r--src/testdir/test_profile.vim38
-rw-r--r--src/version.c2
3 files changed, 69 insertions, 28 deletions
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 660c0c906..e9a9a6de6 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -1714,7 +1714,7 @@ script_do_profile(scriptitem_T *si)
}
/*
- * save time when starting to invoke another script or function.
+ * Save time when starting to invoke another script or function.
*/
void
script_prof_save(
@@ -1805,12 +1805,14 @@ script_dump_profile(FILE *fd)
fprintf(fd, "Cannot open file!\n");
else
{
- for (i = 0; i < si->sn_prl_ga.ga_len; ++i)
+ /* Keep going till the end of file, so that trailing
+ * continuation lines are listed. */
+ for (i = 0; ; ++i)
{
if (vim_fgets(IObuff, IOSIZE, sfd))
break;
- pp = &PRL_ITEM(si, i);
- if (pp->snp_count > 0)
+ if (i < si->sn_prl_ga.ga_len
+ && (pp = &PRL_ITEM(si, i))->snp_count > 0)
{
fprintf(fd, "%5d ", pp->snp_count);
if (profile_equal(&pp->sn_prl_total, &pp->sn_prl_self))
@@ -4234,27 +4236,6 @@ do_source(
save_sourcing_lnum = sourcing_lnum;
sourcing_lnum = 0;
-#ifdef FEAT_MBYTE
- cookie.conv.vc_type = CONV_NONE; /* no conversion */
-
- /* Read the first line so we can check for a UTF-8 BOM. */
- firstline = getsourceline(0, (void *)&cookie, 0);
- if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
- && firstline[1] == 0xbb && firstline[2] == 0xbf)
- {
- /* Found BOM; setup conversion, skip over BOM and recode the line. */
- convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
- p = string_convert(&cookie.conv, firstline + 3, NULL);
- if (p == NULL)
- p = vim_strsave(firstline + 3);
- if (p != NULL)
- {
- vim_free(firstline);
- firstline = p;
- }
- }
-#endif
-
#ifdef STARTUPTIME
if (time_fd != NULL)
time_push(&tv_rel, &tv_start);
@@ -4347,6 +4328,27 @@ do_source(
# endif
#endif
+#ifdef FEAT_MBYTE
+ cookie.conv.vc_type = CONV_NONE; /* no conversion */
+
+ /* Read the first line so we can check for a UTF-8 BOM. */
+ firstline = getsourceline(0, (void *)&cookie, 0);
+ if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
+ && firstline[1] == 0xbb && firstline[2] == 0xbf)
+ {
+ /* Found BOM; setup conversion, skip over BOM and recode the line. */
+ convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
+ p = string_convert(&cookie.conv, firstline + 3, NULL);
+ if (p == NULL)
+ p = vim_strsave(firstline + 3);
+ if (p != NULL)
+ {
+ vim_free(firstline);
+ firstline = p;
+ }
+ }
+#endif
+
/*
* Call do_cmdline, which will call getsourceline() to get the lines.
*/
@@ -4829,7 +4831,8 @@ script_line_start(void)
{
/* Grow the array before starting the timer, so that the time spent
* here isn't counted. */
- (void)ga_grow(&si->sn_prl_ga, (int)(sourcing_lnum - si->sn_prl_ga.ga_len));
+ (void)ga_grow(&si->sn_prl_ga,
+ (int)(sourcing_lnum - si->sn_prl_ga.ga_len));
si->sn_prl_idx = sourcing_lnum - 1;
while (si->sn_prl_ga.ga_len <= si->sn_prl_idx
&& si->sn_prl_ga.ga_len < si->sn_prl_ga.ga_maxlen)
@@ -4864,7 +4867,7 @@ script_line_exec(void)
}
/*
- * Called when done with a function line.
+ * Called when done with a script line.
*/
void
script_line_end(void)
diff --git a/src/testdir/test_profile.vim b/src/testdir/test_profile.vim
index f0ef923f3..ab39bcb64 100644
--- a/src/testdir/test_profile.vim
+++ b/src/testdir/test_profile.vim
@@ -115,7 +115,7 @@ func Test_profile_file()
call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
call assert_equal('', lines[4])
call assert_equal('count total (s) self (s)', lines[5])
- call assert_equal(' func! Foo()', lines[6])
+ call assert_match(' 2 0.\d\+ func! Foo()', lines[6])
call assert_equal(' endfunc', lines[7])
" Loop iterates 10 times. Since script runs twice, body executes 20 times.
" First line of loop executes one more time than body to detect end of loop.
@@ -132,6 +132,42 @@ func Test_profile_file()
call delete('Xprofile_file.log')
endfunc
+func Test_profile_file_with_cont()
+ let lines = [
+ \ 'echo "hello',
+ \ ' \ world"',
+ \ 'echo "foo ',
+ \ ' \bar"',
+ \ ]
+
+ call writefile(lines, 'Xprofile_file.vim')
+ call system(v:progpath
+ \ . ' -es --clean'
+ \ . ' -c "profile start Xprofile_file.log"'
+ \ . ' -c "profile file Xprofile_file.vim"'
+ \ . ' -c "so Xprofile_file.vim"'
+ \ . ' -c "qall!"')
+ call assert_equal(0, v:shell_error)
+
+ let lines = readfile('Xprofile_file.log')
+ call assert_equal(11, len(lines))
+
+ call assert_match('^SCRIPT .*Xprofile_file.vim$', lines[0])
+ call assert_equal('Sourced 1 time', lines[1])
+ call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[2])
+ call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
+ call assert_equal('', lines[4])
+ call assert_equal('count total (s) self (s)', lines[5])
+ call assert_match(' 1 0.\d\+ echo "hello', lines[6])
+ call assert_equal(' \ world"', lines[7])
+ call assert_match(' 1 0.\d\+ echo "foo ', lines[8])
+ call assert_equal(' \bar"', lines[9])
+ call assert_equal('', lines[10])
+
+ call delete('Xprofile_file.vim')
+ call delete('Xprofile_file.log')
+endfunc
+
func Test_profile_completion()
call feedkeys(":profile \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profile continue file func pause start', @:)
diff --git a/src/version.c b/src/version.c
index b0f8c5f51..040d32466 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 */
/**/
+ 1207,
+/**/
1206,
/**/
1205,