From: Bram Moolenaar Date: Sat, 9 May 2020 21:20:20 +0000 (+0200) Subject: patch 8.2.0726: Vim9: leaking memory when calling not compiled :def function X-Git-Tag: v8.2.0726 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3b6a6eb7b4e0ac5b75dd2518bd27bce2b13298a3;p=vim 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 index bc93675ab..ef7dedb98 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 726, /**/ 725, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index bfa24928a..4d4df0ab6 100644 --- 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; } - ectx.ec_dfunc_idx = ufunc->uf_dfunc_idx; + 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.