Mercurial > vim
changeset 26360:a5dac0a9aa5f v8.2.3711
patch 8.2.3711: Vim9: memory leak when compiling :elseif fails
Commit: https://github.com/vim/vim/commit/56a8ffdb6e903615ed824a503f5fa6382b5b3df5
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Dec 1 10:10:22 2021 +0000
patch 8.2.3711: Vim9: memory leak when compiling :elseif fails
Problem: Vim9: memory leak when compiling :elseif fails.
Solution: Cleanup ppconst.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 01 Dec 2021 11:15:03 +0100 |
parents | 93ab37175d0c |
children | 51dc5e9bbfb0 |
files | src/testdir/test_vim9_cmd.vim src/version.c src/vim9compile.c |
diffstat | 3 files changed, 17 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -301,12 +301,21 @@ def Test_condition_types() CheckDefAndScriptFailure(lines, 'E1135:', 3) lines =<< trim END + g:cond = 0 + if g:cond + elseif 'text' garbage + endif + END + CheckDefAndScriptFailure(lines, 'E488:', 3) + + lines =<< trim END + g:cond = 0 if g:cond elseif [1] endif END - CheckDefFailure(lines, 'E1012:', 2) - CheckScriptFailure(['vim9script'] + lines, 'E745:', 3) + CheckDefFailure(lines, 'E1012:', 3) + CheckScriptFailure(['vim9script'] + lines, 'E745:', 4) lines =<< trim END g:cond = 'text'
--- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3711, +/**/ 3710, /**/ 3709,
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -7888,6 +7888,7 @@ compile_elseif(char_u *arg, cctx_T *cctx cctx->ctx_skip = save_skip; if (!ends_excmd2(arg, skipwhite(p))) { + clear_ppconst(&ppconst); semsg(_(e_trailing_arg), p); return NULL; } @@ -7901,7 +7902,10 @@ compile_elseif(char_u *arg, cctx_T *cctx // The expression result is a constant. v = tv_get_bool_chk(&ppconst.pp_tv[0], &error); if (error) + { + clear_ppconst(&ppconst); return NULL; + } cctx->ctx_skip = v ? SKIP_NOT : SKIP_YES; clear_ppconst(&ppconst); scope->se_u.se_if.is_if_label = -1;