0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.0697: Vim9: memory leak when using nested function

Problem:    Vim9: memory leak when using nested function.
Solution:   Unreference function when deleting instructions. Adjust reference
            count for local variables.
This commit is contained in:
Bram Moolenaar
2020-05-05 19:46:20 +02:00
parent 0e65d3de0a
commit 221fcc741a
3 changed files with 30 additions and 4 deletions

View File

@@ -264,10 +264,27 @@ handle_closure_in_use(ectx_T *ectx, int free_arguments)
{
tv = STACK_TV(ectx->ec_frame_idx + STACK_FRAME_SIZE
+ dfunc->df_varcount + idx);
if (tv->v_type == VAR_PARTIAL && tv->vval.v_partial->pt_refcount > 1)
if (tv->v_type == VAR_PARTIAL && tv->vval.v_partial != NULL
&& tv->vval.v_partial->pt_refcount > 1)
{
closure_in_use = TRUE;
break;
int refcount = tv->vval.v_partial->pt_refcount;
int i;
// A Reference in a local variables doesn't count, its get
// unreferenced on return.
for (i = 0; i < dfunc->df_varcount; ++i)
{
typval_T *stv = STACK_TV(ectx->ec_frame_idx
+ STACK_FRAME_SIZE + i);
if (stv->v_type == VAR_PARTIAL
&& tv->vval.v_partial == stv->vval.v_partial)
--refcount;
}
if (refcount > 1)
{
closure_in_use = TRUE;
break;
}
}
}