patch 8.2.1712: Vim9: leaking memory when calling a lambda
Problem: Vim9: leaking memory when calling a lambda.
Solution: Decrement function reference from ISN_DCALL.
diff --git a/src/userfunc.c b/src/userfunc.c
index d6a7e5d..595963d 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1058,7 +1058,7 @@
* using function() does not count as a reference, because the function is
* looked up by name.
*/
- static int
+ int
func_name_refcount(char_u *name)
{
return isdigit(*name) || *name == '<';
@@ -1176,8 +1176,9 @@
* Free a function and remove it from the list of functions. Does not free
* what a function contains, call func_clear() first.
* When "force" is TRUE we are exiting.
+ * Returns OK when the function was actually freed.
*/
- static void
+ static int
func_free(ufunc_T *fp, int force)
{
// Only remove it when not done already, otherwise we would remove a newer
@@ -1191,7 +1192,9 @@
unlink_def_function(fp);
VIM_CLEAR(fp->uf_name_exp);
vim_free(fp);
+ return OK;
}
+ return FAIL;
}
/*
@@ -1890,9 +1893,13 @@
++skipped;
else
{
- func_free(fp, FALSE);
- skipped = 0;
- break;
+ if (func_free(fp, FALSE) == OK)
+ {
+ skipped = 0;
+ break;
+ }
+ // did not actually free it
+ ++skipped;
}
}
}