]> granicus.if.org Git - vim/commitdiff
patch 8.0.1207: profiling skips the first and last script line v8.0.1207
authorBram Moolenaar <Bram@vim.org>
Thu, 19 Oct 2017 19:04:37 +0000 (21:04 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 19 Oct 2017 19:04:37 +0000 (21:04 +0200)
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.

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

index 660c0c9062a0975e98f807122353e497001729f8..e9a9a6de6fdd3fc96a6752f25dfbf047d5c3ae2a 100644 (file)
@@ -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)
index f0ef923f3075056996855b3393d3afc6bfbbcc06..ab39bcb644cd6bfa432b2ff87fe47b0a83ba7da2 100644 (file)
@@ -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', @:)
index b0f8c5f51e04466b43d8c14c6840c44bbcc904c2..040d32466bf44f98edb9f4c061fd31bf12ca76d9 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1207,
 /**/
     1206,
 /**/