0
0
mirror of https://github.com/vim/vim.git synced 2025-09-01 21:03:39 -04:00

patch 8.2.3753: Vim9: function unreferenced while called is never deleted

Problem:    Vim9: function unreferenced while called is never deleted.
Solution:   Delete a function when no longer referenced.
This commit is contained in:
Bram Moolenaar 2021-12-06 15:06:54 +00:00
parent 8603be338a
commit 2336c376d5
4 changed files with 7 additions and 3 deletions

View File

@ -12,6 +12,7 @@ ufunc_T *find_func_even_dead(char_u *name, int is_global, cctx_T *cctx);
ufunc_T *find_func(char_u *name, int is_global, cctx_T *cctx);
int func_is_global(ufunc_T *ufunc);
int func_name_refcount(char_u *name);
void func_clear_free(ufunc_T *fp, int force);
int copy_func(char_u *lambda, char_u *global, ectx_T *ectx);
int funcdepth_increment(void);
void funcdepth_decrement(void);

View File

@ -2281,7 +2281,7 @@ func_free(ufunc_T *fp, int force)
* Free all things that a function contains and free the function itself.
* When "force" is TRUE we are exiting.
*/
static void
void
func_clear_free(ufunc_T *fp, int force)
{
func_clear(fp, force);

View File

@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3753,
/**/
3752,
/**/

View File

@ -4988,8 +4988,9 @@ call_def_function(
estack_pop();
current_sctx = save_current_sctx;
// TODO: when is it safe to delete the function if it is no longer used?
--ufunc->uf_calls;
if (--ufunc->uf_calls <= 0 && ufunc->uf_refcount <= 0)
// Function was unreferenced while being used, free it now.
func_clear_free(ufunc, FALSE);
if (*msg_list != NULL && saved_msg_list != NULL)
{