mirror of
https://github.com/neovim/neovim.git
synced 2025-09-28 22:18:33 +00:00
vim-patch:8.0.1207
Problem: Profiling skips the first and last script line.
Solution: Check for BOM after setting script ID. (Lemonboy, closes vim/vim#2103,
closes vim/vim#2112) Add a test. List the trailing script lines.
67435d9983
This commit is contained in:
@@ -1068,7 +1068,7 @@ static void profile_init(scriptitem_T *si)
|
||||
si->sn_pr_nest = 0;
|
||||
}
|
||||
|
||||
/// save time when starting to invoke another script or function.
|
||||
/// Save time when starting to invoke another script or function.
|
||||
void script_prof_save(
|
||||
proftime_T *tm // place to store wait time
|
||||
)
|
||||
@@ -1141,12 +1141,14 @@ static void script_dump_profile(FILE *fd)
|
||||
if (sfd == NULL) {
|
||||
fprintf(fd, "Cannot open file!\n");
|
||||
} else {
|
||||
for (int 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 (int 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)) {
|
||||
fprintf(fd, " ");
|
||||
@@ -2871,22 +2873,6 @@ int do_source(char_u *fname, int check_other, int is_vimrc)
|
||||
save_sourcing_lnum = sourcing_lnum;
|
||||
sourcing_lnum = 0;
|
||||
|
||||
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);
|
||||
}
|
||||
xfree(firstline);
|
||||
firstline = p;
|
||||
}
|
||||
|
||||
// start measuring script load time if --startuptime was passed and
|
||||
// time_fd was successfully opened afterwards.
|
||||
proftime_T rel_time;
|
||||
@@ -2959,6 +2945,22 @@ int do_source(char_u *fname, int check_other, int is_vimrc)
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
xfree(firstline);
|
||||
firstline = p;
|
||||
}
|
||||
|
||||
// Call do_cmdline, which will call getsourceline() to get the lines.
|
||||
do_cmdline(firstline, getsourceline, (void *)&cookie,
|
||||
DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
|
||||
@@ -3281,7 +3283,8 @@ void script_line_start(void)
|
||||
if (si->sn_prof_on && sourcing_lnum >= 1) {
|
||||
// Grow the array before starting the timer, so that the time spent
|
||||
// here isn't counted.
|
||||
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) {
|
||||
|
Reference in New Issue
Block a user