Mercurial > vim
diff src/userfunc.c @ 23976:03819ebd3e6d v8.2.2530
patch 8.2.2530: Vim9: not enough testing for profiling
Commit: https://github.com/vim/vim/commit/12d265315fac9e4f3436c38a87f6d9a23b9e7e2b
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Feb 19 19:13:21 2021 +0100
patch 8.2.2530: Vim9: not enough testing for profiling
Problem: Vim9: not enough testing for profiling.
Solution: Add a test with nested functions and a lambda. Fix profiling
for calling a compiled function.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 19 Feb 2021 19:15:03 +0100 |
parents | e979bf909fd8 |
children | 686af23ec132 |
line wrap: on
line diff
--- a/src/userfunc.c +++ b/src/userfunc.c @@ -1649,16 +1649,20 @@ call_user_func( if (fp->uf_def_status != UF_NOT_COMPILED) { +#ifdef FEAT_PROFILE + ufunc_T *caller = fc->caller == NULL ? NULL : fc->caller->func; +#endif // Execute the function, possibly compiling it first. #ifdef FEAT_PROFILE - profile_may_start_func(&profile_info, fp, fc); + if (do_profiling == PROF_YES) + profile_may_start_func(&profile_info, fp, caller); #endif call_def_function(fp, argcount, argvars, funcexe->partial, rettv); funcdepth_decrement(); #ifdef FEAT_PROFILE if (do_profiling == PROF_YES && (fp->uf_profiling - || (fc->caller != NULL && fc->caller->func->uf_profiling))) - profile_may_end_func(&profile_info, fp, fc); + || (caller != NULL && caller->uf_profiling))) + profile_may_end_func(&profile_info, fp, caller); #endif current_funccal = fc->caller; free_funccal(fc); @@ -1872,7 +1876,9 @@ call_user_func( --no_wait_return; } #ifdef FEAT_PROFILE - profile_may_start_func(&profile_info, fp, fc); + if (do_profiling == PROF_YES) + profile_may_start_func(&profile_info, fp, + fc->caller == NULL ? NULL : fc->caller->func); #endif save_current_sctx = current_sctx; @@ -1908,9 +1914,13 @@ call_user_func( } #ifdef FEAT_PROFILE - if (do_profiling == PROF_YES && (fp->uf_profiling - || (fc->caller != NULL && fc->caller->func->uf_profiling))) - profile_may_end_func(&profile_info, fp, fc); + if (do_profiling == PROF_YES) + { + ufunc_T *caller = fc->caller == NULL ? NULL : fc->caller->func; + + if (fp->uf_profiling || (caller != NULL && caller->uf_profiling)) + profile_may_end_func(&profile_info, fp, caller); + } #endif // when being verbose, mention the return value