vim-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.
ad64809610
This commit is contained in:
Daniel Hahler 2019-06-08 13:04:06 +02:00
parent b398b1eedd
commit 7823b35781
2 changed files with 31 additions and 23 deletions

View File

@ -5871,10 +5871,6 @@ static int get_lambda_tv(char_u **arg, typval_T *rettv, bool evaluate)
fp->uf_scoped = NULL; fp->uf_scoped = NULL;
} }
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);
} }
@ -21628,26 +21624,30 @@ static void 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 */ if (len == 0) {
fp->uf_tm_count = 0; len = 1; // avoid getting error for allocating zero bytes
fp->uf_tm_self = profile_zero(); }
fp->uf_tm_total = profile_zero(); fp->uf_tm_count = 0;
fp->uf_tm_self = profile_zero();
fp->uf_tm_total = profile_zero();
if (fp->uf_tml_count == NULL) { if (fp->uf_tml_count == NULL) {
fp->uf_tml_count = xcalloc(len, sizeof(int)); fp->uf_tml_count = xcalloc(len, sizeof(int));
}
if (fp->uf_tml_total == NULL) {
fp->uf_tml_total = xcalloc(len, sizeof(proftime_T));
}
if (fp->uf_tml_self == NULL) {
fp->uf_tml_self = xcalloc(len, sizeof(proftime_T));
}
fp->uf_tml_idx = -1;
fp->uf_prof_initialized = true;
} }
if (fp->uf_tml_total == NULL) {
fp->uf_tml_total = xcalloc(len, sizeof(proftime_T));
}
if (fp->uf_tml_self == NULL) {
fp->uf_tml_self = xcalloc(len, sizeof(proftime_T));
}
fp->uf_tml_idx = -1;
fp->uf_profiling = TRUE; fp->uf_profiling = TRUE;
} }
@ -21672,7 +21672,7 @@ void func_dump_profile(FILE *fd)
if (!HASHITEM_EMPTY(hi)) { if (!HASHITEM_EMPTY(hi)) {
--todo; --todo;
fp = HI2UF(hi); fp = HI2UF(hi);
if (fp->uf_profiling) { if (fp->uf_prof_initialized) {
sorttab[st_len++] = fp; sorttab[st_len++] = fp;
if (fp->uf_name[0] == K_SPECIAL) if (fp->uf_name[0] == K_SPECIAL)
@ -22174,6 +22174,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars,
char_u *name; char_u *name;
proftime_T wait_start; proftime_T wait_start;
proftime_T call_start; proftime_T call_start;
int started_profiling = false;
bool did_save_redo = false; bool did_save_redo = false;
save_redo_T save_redo; save_redo_T save_redo;
@ -22393,8 +22394,10 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars,
do_profiling_yes do_profiling_yes
&& !fp->uf_profiling && has_profiling(false, fp->uf_name, NULL); && !fp->uf_profiling && has_profiling(false, fp->uf_name, NULL);
if (func_not_yet_profiling_but_should) if (func_not_yet_profiling_but_should) {
started_profiling = true;
func_do_profile(fp); func_do_profile(fp);
}
bool func_or_func_caller_profiling = bool func_or_func_caller_profiling =
do_profiling_yes do_profiling_yes
@ -22442,6 +22445,10 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars,
fc->caller->func->uf_tml_children = fc->caller->func->uf_tml_children =
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;
}
} }
/* when being verbose, mention the return value */ /* when being verbose, mention the return value */

View File

@ -260,6 +260,7 @@ struct ufunc {
garray_T uf_args; ///< arguments garray_T uf_args; ///< arguments
garray_T uf_lines; ///< function lines garray_T uf_lines; ///< function lines
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