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:
@@ -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 */
|
||||||
|
@@ -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;
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user