To: vim_dev@googlegroups.com Subject: Patch 8.0.1207 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.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. Files: src/testdir/test_profile.vim, src/ex_cmds2.c *** ../vim-8.0.1206/src/testdir/test_profile.vim 2017-08-14 23:13:26.054283184 +0200 --- src/testdir/test_profile.vim 2017-10-19 20:59:24.124023627 +0200 *************** *** 115,121 **** 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_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. --- 115,121 ---- 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(' 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. *************** *** 130,135 **** --- 130,171 ---- call delete('Xprofile_file.vim') 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() *** ../vim-8.0.1206/src/ex_cmds2.c 2017-09-18 21:50:42.720750714 +0200 --- src/ex_cmds2.c 2017-10-19 21:04:15.122012696 +0200 *************** *** 1714,1720 **** } /* ! * save time when starting to invoke another script or function. */ void script_prof_save( --- 1714,1720 ---- } /* ! * Save time when starting to invoke another script or function. */ void script_prof_save( *************** *** 1805,1816 **** fprintf(fd, "Cannot open file!\n"); else { ! for (i = 0; i < si->sn_prl_ga.ga_len; ++i) { if (vim_fgets(IObuff, IOSIZE, sfd)) break; ! pp = &PRL_ITEM(si, i); ! if (pp->snp_count > 0) { fprintf(fd, "%5d ", pp->snp_count); if (profile_equal(&pp->sn_prl_total, &pp->sn_prl_self)) --- 1805,1818 ---- fprintf(fd, "Cannot open file!\n"); else { ! /* 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; ! 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,4260 **** 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); --- 4236,4241 ---- *************** *** 4347,4352 **** --- 4328,4354 ---- # 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,4835 **** { /* 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)); 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) --- 4831,4838 ---- { /* 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)); 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,4870 **** } /* ! * Called when done with a function line. */ void script_line_end(void) --- 4867,4873 ---- } /* ! * Called when done with a script line. */ void script_line_end(void) *** ../vim-8.0.1206/src/version.c 2017-10-19 18:35:46.094557713 +0200 --- src/version.c 2017-10-19 21:03:28.038337685 +0200 *************** *** 763,764 **** --- 763,766 ---- { /* Add new patch number below this line */ + /**/ + 1207, /**/ -- Vim is like Emacs without all the typing. (John "Johann" Spetz) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///