Mercurial > vim
changeset 19896:92177b596695 v8.2.0504
patch 8.2.0504: Vim9: leaking scope memory when compilation fails
Commit: https://github.com/vim/vim/commit/3cca299520a4980fd1b124564bd67782ca977c15
Author: Bram Moolenaar <Bram@vim.org>
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 02 Apr 2020 23:00:03 +0200 |
parents | 301db57c7e83 |
children | 9798325ea060 |
files | src/version.c src/vim9compile.c |
diffstat | 2 files changed, 31 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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,
--- 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);