patch 8.2.2866: Vim9: memory leak when using inline function
Problem: Vim9: memory leak when using inline function.
Solution: Remember what strings to free.
diff --git a/src/eval.c b/src/eval.c
index 97c5f78..b5820b8 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -416,6 +416,7 @@
int res;
int vim9script = in_vim9script();
garray_T *gap = evalarg == NULL ? NULL : &evalarg->eval_ga;
+ garray_T *freegap = evalarg == NULL ? NULL : &evalarg->eval_freega;
int save_flags = evalarg == NULL ? 0 : evalarg->eval_flags;
int evaluate = evalarg == NULL
? FALSE : (evalarg->eval_flags & EVAL_EVALUATE);
@@ -427,6 +428,7 @@
// leave room for "start"
if (ga_grow(gap, 1) == OK)
++gap->ga_len;
+ ga_init2(freegap, sizeof(char_u *), 10);
}
*start = *arg;
@@ -444,7 +446,7 @@
{
if (evalarg->eval_ga.ga_len == 1)
{
- // just one line, no need to concatenate
+ // just the one line, no need to concatenate
ga_clear(gap);
gap->ga_itemsize = 0;
}
@@ -471,7 +473,13 @@
ga_clear_strings(gap);
}
else
+ {
ga_clear(gap);
+
+ // free lines that were explicitly marked for freeing
+ ga_clear_strings(freegap);
+ }
+
gap->ga_itemsize = 0;
if (p == NULL)
return FAIL;
@@ -3530,7 +3538,7 @@
/*
* nested expression: (expression).
- * lambda: (arg) => expr
+ * or lambda: (arg) => expr
*/
case '(': ret = NOTDONE;
if (in_vim9script())