0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

patch 8.1.0130: ":profdel func" does not work if func was called already

Problem:    ":profdel func" does not work if func was called already.
            (Dominique Pelle)
Solution:   Reset uf_profiling and add a flag to indicate initialization was
            done.
This commit is contained in:
Bram Moolenaar
2018-06-30 18:28:03 +02:00
parent 668324ef4f
commit ad64809610
3 changed files with 33 additions and 22 deletions

View File

@@ -1345,6 +1345,7 @@ typedef struct
garray_T uf_lines; /* function lines */ garray_T uf_lines; /* function lines */
#ifdef FEAT_PROFILE #ifdef FEAT_PROFILE
int uf_profiling; /* TRUE when func is being profiled */ int uf_profiling; /* TRUE when func is being profiled */
int uf_prof_initialized;
/* profiling the function as a whole */ /* profiling the function as a whole */
int uf_tm_count; /* nr of calls */ int uf_tm_count; /* nr of calls */
proftime_T uf_tm_total; /* time spent in function + children */ proftime_T uf_tm_total; /* time spent in function + children */

View File

@@ -293,10 +293,6 @@ get_lambda_tv(char_u **arg, typval_T *rettv, int evaluate)
fp->uf_scoped = NULL; fp->uf_scoped = NULL;
#ifdef FEAT_PROFILE #ifdef FEAT_PROFILE
fp->uf_tml_count = NULL;
fp->uf_tml_total = NULL;
fp->uf_tml_self = NULL;
fp->uf_profiling = FALSE;
if (prof_def_func()) if (prof_def_func())
func_do_profile(fp); func_do_profile(fp);
#endif #endif
@@ -706,6 +702,7 @@ call_user_func(
#ifdef FEAT_PROFILE #ifdef FEAT_PROFILE
proftime_T wait_start; proftime_T wait_start;
proftime_T call_start; proftime_T call_start;
int started_profiling = FALSE;
#endif #endif
/* If depth of calling is getting too high, don't execute the function */ /* If depth of calling is getting too high, don't execute the function */
@@ -921,7 +918,10 @@ call_user_func(
if (do_profiling == PROF_YES) if (do_profiling == PROF_YES)
{ {
if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL)) if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL))
{
started_profiling = TRUE;
func_do_profile(fp); func_do_profile(fp);
}
if (fp->uf_profiling if (fp->uf_profiling
|| (fc->caller != NULL && fc->caller->func->uf_profiling)) || (fc->caller != NULL && fc->caller->func->uf_profiling))
{ {
@@ -965,6 +965,9 @@ call_user_func(
profile_add(&fc->caller->func->uf_tm_children, &call_start); profile_add(&fc->caller->func->uf_tm_children, &call_start);
profile_add(&fc->caller->func->uf_tml_children, &call_start); profile_add(&fc->caller->func->uf_tml_children, &call_start);
} }
if (started_profiling)
// make a ":profdel func" stop profiling the function
fp->uf_profiling = FALSE;
} }
#endif #endif
@@ -2522,23 +2525,28 @@ func_do_profile(ufunc_T *fp)
{ {
int len = fp->uf_lines.ga_len; int len = fp->uf_lines.ga_len;
if (len == 0) if (!fp->uf_prof_initialized)
len = 1; /* avoid getting error for allocating zero bytes */ {
fp->uf_tm_count = 0; if (len == 0)
profile_zero(&fp->uf_tm_self); len = 1; /* avoid getting error for allocating zero bytes */
profile_zero(&fp->uf_tm_total); fp->uf_tm_count = 0;
if (fp->uf_tml_count == NULL) profile_zero(&fp->uf_tm_self);
fp->uf_tml_count = (int *)alloc_clear((unsigned) (sizeof(int) * len)); profile_zero(&fp->uf_tm_total);
if (fp->uf_tml_total == NULL) if (fp->uf_tml_count == NULL)
fp->uf_tml_total = (proftime_T *)alloc_clear((unsigned) fp->uf_tml_count = (int *)alloc_clear(
(sizeof(proftime_T) * len)); (unsigned)(sizeof(int) * len));
if (fp->uf_tml_self == NULL) if (fp->uf_tml_total == NULL)
fp->uf_tml_self = (proftime_T *)alloc_clear((unsigned) fp->uf_tml_total = (proftime_T *)alloc_clear(
(sizeof(proftime_T) * len)); (unsigned)(sizeof(proftime_T) * len));
fp->uf_tml_idx = -1; if (fp->uf_tml_self == NULL)
if (fp->uf_tml_count == NULL || fp->uf_tml_total == NULL fp->uf_tml_self = (proftime_T *)alloc_clear(
|| fp->uf_tml_self == NULL) (unsigned)(sizeof(proftime_T) * len));
return; /* out of memory */ fp->uf_tml_idx = -1;
if (fp->uf_tml_count == NULL || fp->uf_tml_total == NULL
|| fp->uf_tml_self == NULL)
return; /* out of memory */
fp->uf_prof_initialized = TRUE;
}
fp->uf_profiling = TRUE; fp->uf_profiling = TRUE;
} }
@@ -2568,7 +2576,7 @@ func_dump_profile(FILE *fd)
{ {
--todo; --todo;
fp = HI2UF(hi); fp = HI2UF(hi);
if (fp->uf_profiling) if (fp->uf_prof_initialized)
{ {
if (sorttab != NULL) if (sorttab != NULL)
sorttab[st_len++] = fp; sorttab[st_len++] = fp;

View File

@@ -789,6 +789,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 */
/**/
130,
/**/ /**/
129, 129,
/**/ /**/