# HG changeset patch # User Bram Moolenaar # Date 1589059803 -7200 # Node ID cf2620e7a6aa16abda395257446a221e8c3d139b # Parent f36a7f769ba4c27d78514cda62f498ed97f3a996 patch 8.2.0726: Vim9: leaking memory when calling not compiled :def function Commit: https://github.com/vim/vim/commit/3b6a6eb7b4e0ac5b75dd2518bd27bce2b13298a3 Author: Bram Moolenaar Date: Sat May 9 23:20:20 2020 +0200 patch 8.2.0726: Vim9: leaking memory when calling not compiled :def function Problem: Vim9: leaking memory when calling not compiled :def function. Solution: Check if function is compiled earlier. diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 726, +/**/ 725, /**/ 724, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -665,10 +665,6 @@ call_def_function( // Like STACK_TV_VAR but use the outer scope #define STACK_OUT_TV_VAR(idx) (((typval_T *)ectx.ec_outer_stack->ga_data) + ectx.ec_outer_frame + STACK_FRAME_SIZE + idx) - CLEAR_FIELD(ectx); - ga_init2(&ectx.ec_stack, sizeof(typval_T), 500); - if (ga_grow(&ectx.ec_stack, 20) == FAIL) - return FAIL; { // Check the function was compiled, it is postponed in ex_vim9script(). dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) @@ -676,8 +672,12 @@ call_def_function( if (dfunc->df_instr == NULL) return FAIL; } + + CLEAR_FIELD(ectx); ectx.ec_dfunc_idx = ufunc->uf_dfunc_idx; - + ga_init2(&ectx.ec_stack, sizeof(typval_T), 500); + if (ga_grow(&ectx.ec_stack, 20) == FAIL) + return FAIL; ga_init2(&ectx.ec_trystack, sizeof(trycmd_T), 10); // Put arguments on the stack.