# HG changeset patch # User Christian Brabandt # Date 1508440504 -7200 # Node ID 20aacdca367d7d518aa31b540152b53d4306ffc0 # Parent cf67c5911f88df8df02ba49c7c94b10f17561b1b patch 8.0.1207: profiling skips the first and last script line commit https://github.com/vim/vim/commit/67435d9983965c5c77fc74f0559779ce4554dacb Author: Bram Moolenaar Date: Thu Oct 19 21:04:37 2017 +0200 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 https://github.com/vim/vim/issues/2103, closes #2112) Add a test. List the trailing script lines. diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c --- 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 --- 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 \\\"\", 'tx') call assert_equal('"profile continue file func pause start', @:) diff --git a/src/version.c b/src/version.c --- 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,