Mercurial > vim
changeset 20341:cf2620e7a6aa v8.2.0726
patch 8.2.0726: Vim9: leaking memory when calling not compiled :def function
Commit: https://github.com/vim/vim/commit/3b6a6eb7b4e0ac5b75dd2518bd27bce2b13298a3
Author: Bram Moolenaar <Bram@vim.org>
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 09 May 2020 23:30:03 +0200 |
parents | f36a7f769ba4 |
children | 2495ffe31bcc |
files | src/version.c src/vim9execute.c |
diffstat | 2 files changed, 7 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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,
--- 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.