mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.0.1207: profiling skips the first and last script line
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.
This commit is contained in:
@@ -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
|
void
|
||||||
script_prof_save(
|
script_prof_save(
|
||||||
@@ -1805,12 +1805,14 @@ script_dump_profile(FILE *fd)
|
|||||||
fprintf(fd, "Cannot open file!\n");
|
fprintf(fd, "Cannot open file!\n");
|
||||||
else
|
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))
|
if (vim_fgets(IObuff, IOSIZE, sfd))
|
||||||
break;
|
break;
|
||||||
pp = &PRL_ITEM(si, i);
|
if (i < si->sn_prl_ga.ga_len
|
||||||
if (pp->snp_count > 0)
|
&& (pp = &PRL_ITEM(si, i))->snp_count > 0)
|
||||||
{
|
{
|
||||||
fprintf(fd, "%5d ", pp->snp_count);
|
fprintf(fd, "%5d ", pp->snp_count);
|
||||||
if (profile_equal(&pp->sn_prl_total, &pp->sn_prl_self))
|
if (profile_equal(&pp->sn_prl_total, &pp->sn_prl_self))
|
||||||
@@ -4234,27 +4236,6 @@ do_source(
|
|||||||
save_sourcing_lnum = sourcing_lnum;
|
save_sourcing_lnum = sourcing_lnum;
|
||||||
sourcing_lnum = 0;
|
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
|
#ifdef STARTUPTIME
|
||||||
if (time_fd != NULL)
|
if (time_fd != NULL)
|
||||||
time_push(&tv_rel, &tv_start);
|
time_push(&tv_rel, &tv_start);
|
||||||
@@ -4347,6 +4328,27 @@ do_source(
|
|||||||
# endif
|
# endif
|
||||||
#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.
|
* 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
|
/* Grow the array before starting the timer, so that the time spent
|
||||||
* here isn't counted. */
|
* 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;
|
si->sn_prl_idx = sourcing_lnum - 1;
|
||||||
while (si->sn_prl_ga.ga_len <= si->sn_prl_idx
|
while (si->sn_prl_ga.ga_len <= si->sn_prl_idx
|
||||||
&& si->sn_prl_ga.ga_len < si->sn_prl_ga.ga_maxlen)
|
&& 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
|
void
|
||||||
script_line_end(void)
|
script_line_end(void)
|
||||||
|
@@ -115,7 +115,7 @@ func Test_profile_file()
|
|||||||
call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
|
call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
|
||||||
call assert_equal('', lines[4])
|
call assert_equal('', lines[4])
|
||||||
call assert_equal('count total (s) self (s)', lines[5])
|
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])
|
call assert_equal(' endfunc', lines[7])
|
||||||
" Loop iterates 10 times. Since script runs twice, body executes 20 times.
|
" 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.
|
" 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')
|
call delete('Xprofile_file.log')
|
||||||
endfunc
|
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()
|
func Test_profile_completion()
|
||||||
call feedkeys(":profile \<C-A>\<C-B>\"\<CR>", 'tx')
|
call feedkeys(":profile \<C-A>\<C-B>\"\<CR>", 'tx')
|
||||||
call assert_equal('"profile continue file func pause start', @:)
|
call assert_equal('"profile continue file func pause start', @:)
|
||||||
|
@@ -761,6 +761,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1207,
|
||||||
/**/
|
/**/
|
||||||
1206,
|
1206,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user