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;