patch 8.2.2400: Vim9: compiled functions are not profiled

Problem:    Vim9: compiled functions are not profiled.
Solution:   Add initial changes to profile compiled functions.  Fix that a
            script-local function was hard to debug.
This commit is contained in:
Bram Moolenaar
2021-01-24 12:53:53 +01:00
parent 7cf0c114d6
commit b204990346
16 changed files with 311 additions and 109 deletions

View File

@ -554,6 +554,51 @@ func_do_profile(ufunc_T *fp)
fp->uf_profiling = TRUE;
}
/*
* When calling a function: may initialize for profiling.
*/
void
profile_may_start_func(profinfo_T *info, ufunc_T *fp, funccall_T *fc)
{
if (do_profiling == PROF_YES)
{
if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL))
{
info->pi_started_profiling = TRUE;
func_do_profile(fp);
}
if (fp->uf_profiling
|| (fc->caller != NULL && fc->caller->func->uf_profiling))
{
++fp->uf_tm_count;
profile_start(&info->pi_call_start);
profile_zero(&fp->uf_tm_children);
}
script_prof_save(&info->pi_wait_start);
}
}
/*
* After calling a function: may handle profiling. profile_may_start_func()
* must have been called previously.
*/
void
profile_may_end_func(profinfo_T *info, ufunc_T *fp, funccall_T *fc)
{
profile_end(&info->pi_call_start);
profile_sub_wait(&info->pi_wait_start, &info->pi_call_start);
profile_add(&fp->uf_tm_total, &info->pi_call_start);
profile_self(&fp->uf_tm_self, &info->pi_call_start, &fp->uf_tm_children);
if (fc->caller != NULL && fc->caller->func->uf_profiling)
{
profile_add(&fc->caller->func->uf_tm_children, &info->pi_call_start);
profile_add(&fc->caller->func->uf_tml_children, &info->pi_call_start);
}
if (info->pi_started_profiling)
// make a ":profdel func" stop profiling the function
fp->uf_profiling = FALSE;
}
/*
* Prepare profiling for entering a child or something else that is not
* counted for the script/function itself.
@ -597,15 +642,14 @@ prof_child_exit(
* until later and we need to store the time now.
*/
void
func_line_start(void *cookie)
func_line_start(void *cookie, long lnum)
{
funccall_T *fcp = (funccall_T *)cookie;
ufunc_T *fp = fcp->func;
if (fp->uf_profiling && SOURCING_LNUM >= 1
&& SOURCING_LNUM <= fp->uf_lines.ga_len)
if (fp->uf_profiling && lnum >= 1 && lnum <= fp->uf_lines.ga_len)
{
fp->uf_tml_idx = SOURCING_LNUM - 1;
fp->uf_tml_idx = lnum - 1;
// Skip continuation lines.
while (fp->uf_tml_idx > 0 && FUNCLINE(fp, fp->uf_tml_idx) == NULL)
--fp->uf_tml_idx;