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);