]> granicus.if.org Git - vim/commitdiff
patch 8.2.3711: Vim9: memory leak when compiling :elseif fails v8.2.3711
authorBram Moolenaar <Bram@vim.org>
Wed, 1 Dec 2021 10:10:22 +0000 (10:10 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 1 Dec 2021 10:10:22 +0000 (10:10 +0000)
Problem:    Vim9: memory leak when compiling :elseif fails.
Solution:   Cleanup ppconst.

src/testdir/test_vim9_cmd.vim
src/version.c
src/vim9compile.c

index ece3f734f067e18170d0a814e412dd7281dc3f50..22b1896a1df5e371492801c5aa709ca195b71efc 100644 (file)
@@ -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'
index 37d383247bbebde6d7806b396a79e4addd1d788f..4890e2cde17dcea76beea560e4b27d5d21172f61 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3711,
 /**/
     3710,
 /**/
index 3f72c7f39a20b05a9978b985264d944b6b1b38e1..2ed1f0e58e19229281cee1703200ea5826b62c64 100644 (file)
@@ -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;