diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-06-30 18:28:03 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-06-30 18:28:03 +0200 |
commit | ad6480961080f80a455b2394f27b02935a2ded52 (patch) | |
tree | d857cca5de9f29740f9604310272e88f2ea0ef1b | |
parent | 668324ef4fd59980dc57b2eefe57eddc57c7b920 (diff) | |
download | vim-git-ad6480961080f80a455b2394f27b02935a2ded52.tar.gz |
patch 8.1.0130: ":profdel func" does not work if func was called alreadyv8.1.0130
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.
-rw-r--r-- | src/structs.h | 1 | ||||
-rw-r--r-- | src/userfunc.c | 52 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 33 insertions, 22 deletions
diff --git a/src/structs.h b/src/structs.h index a2de2441e..ec109eb89 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1345,6 +1345,7 @@ typedef struct garray_T uf_lines; /* function lines */ #ifdef FEAT_PROFILE int uf_profiling; /* TRUE when func is being profiled */ + int uf_prof_initialized; /* profiling the function as a whole */ int uf_tm_count; /* nr of calls */ proftime_T uf_tm_total; /* time spent in function + children */ diff --git a/src/userfunc.c b/src/userfunc.c index 08112689d..1c17737ac 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -293,10 +293,6 @@ get_lambda_tv(char_u **arg, typval_T *rettv, int evaluate) fp->uf_scoped = NULL; #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()) func_do_profile(fp); #endif @@ -706,6 +702,7 @@ call_user_func( #ifdef FEAT_PROFILE proftime_T wait_start; proftime_T call_start; + int started_profiling = FALSE; #endif /* 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 (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL)) + { + started_profiling = TRUE; func_do_profile(fp); + } if (fp->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_tml_children, &call_start); } + if (started_profiling) + // make a ":profdel func" stop profiling the function + fp->uf_profiling = FALSE; } #endif @@ -2522,23 +2525,28 @@ func_do_profile(ufunc_T *fp) { int len = fp->uf_lines.ga_len; - if (len == 0) - len = 1; /* avoid getting error for allocating zero bytes */ - fp->uf_tm_count = 0; - profile_zero(&fp->uf_tm_self); - profile_zero(&fp->uf_tm_total); - if (fp->uf_tml_count == NULL) - fp->uf_tml_count = (int *)alloc_clear((unsigned) (sizeof(int) * len)); - if (fp->uf_tml_total == NULL) - fp->uf_tml_total = (proftime_T *)alloc_clear((unsigned) - (sizeof(proftime_T) * len)); - if (fp->uf_tml_self == NULL) - fp->uf_tml_self = (proftime_T *)alloc_clear((unsigned) - (sizeof(proftime_T) * len)); - 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 */ + if (!fp->uf_prof_initialized) + { + if (len == 0) + len = 1; /* avoid getting error for allocating zero bytes */ + fp->uf_tm_count = 0; + profile_zero(&fp->uf_tm_self); + profile_zero(&fp->uf_tm_total); + if (fp->uf_tml_count == NULL) + fp->uf_tml_count = (int *)alloc_clear( + (unsigned)(sizeof(int) * len)); + if (fp->uf_tml_total == NULL) + fp->uf_tml_total = (proftime_T *)alloc_clear( + (unsigned)(sizeof(proftime_T) * len)); + if (fp->uf_tml_self == NULL) + fp->uf_tml_self = (proftime_T *)alloc_clear( + (unsigned)(sizeof(proftime_T) * len)); + 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; } @@ -2568,7 +2576,7 @@ func_dump_profile(FILE *fd) { --todo; fp = HI2UF(hi); - if (fp->uf_profiling) + if (fp->uf_prof_initialized) { if (sorttab != NULL) sorttab[st_len++] = fp; diff --git a/src/version.c b/src/version.c index f4399cc5c..bc3d06a32 100644 --- a/src/version.c +++ b/src/version.c @@ -790,6 +790,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 130, +/**/ 129, /**/ 127, |