# HG changeset patch # User Bram Moolenaar # Date 1585861203 -7200 # Node ID 92177b596695d76d06ce6c03e0bb9bdb95692114 # Parent 301db57c7e837fd301752f7dc414cde24c43303b patch 8.2.0504: Vim9: leaking scope memory when compilation fails Commit: https://github.com/vim/vim/commit/3cca299520a4980fd1b124564bd67782ca977c15 Author: Bram Moolenaar Date: Thu Apr 2 22:57:36 2020 +0200 patch 8.2.0504: Vim9: leaking scope memory when compilation fails Problem: Vim9: leaking scope memory when compilation fails. Solution: Cleanup the scope list. diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -739,6 +739,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 504, +/**/ 503, /**/ 502, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -3995,6 +3995,18 @@ compile_fill_jump_to_end(endlabel_T **el } } + static void +compile_free_jump_to_end(endlabel_T **el) +{ + while (*el != NULL) + { + endlabel_T *cur = (*el); + + *el = cur->el_next; + vim_free(cur); + } +} + /* * Create a new scope and set up the generic items. */ @@ -4026,6 +4038,20 @@ drop_scope(cctx_T *cctx) return; } cctx->ctx_scope = scope->se_outer; + switch (scope->se_type) + { + case IF_SCOPE: + compile_free_jump_to_end(&scope->se_u.se_if.is_end_label); break; + case FOR_SCOPE: + compile_free_jump_to_end(&scope->se_u.se_for.fs_end_label); break; + case WHILE_SCOPE: + compile_free_jump_to_end(&scope->se_u.se_while.ws_end_label); break; + case TRY_SCOPE: + compile_free_jump_to_end(&scope->se_u.se_try.ts_end_label); break; + case NO_SCOPE: + case BLOCK_SCOPE: + break; + } vim_free(scope); } @@ -5519,6 +5545,9 @@ erret: if (!dfunc->df_deleted) --def_functions.ga_len; + while (cctx.ctx_scope != NULL) + drop_scope(&cctx); + // Don't execute this function body. ga_clear_strings(&ufunc->uf_lines);