changeset 25044:a9a21631c090 v8.2.3059

patch 8.2.3059: Vim9: memory leak when using lambda Commit: https://github.com/vim/vim/commit/e3ffaa6b7c2d53ab53da933ec91382d003cf9a12 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jun 26 22:17:35 2021 +0200 patch 8.2.3059: Vim9: memory leak when using lambda Problem: Vim9: memory leak when using lambda. Solution: Do not store the default value strings when skipping.
author Bram Moolenaar <Bram@vim.org>
date Sat, 26 Jun 2021 22:30:04 +0200
parents fc81b4530f92
children bb817601d9f5
files src/userfunc.c src/version.c
diffstat 2 files changed, 22 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -198,7 +198,7 @@ get_function_args(
 	ga_init2(newargs, (int)sizeof(char_u *), 3);
     if (argtypes != NULL)
 	ga_init2(argtypes, (int)sizeof(char_u *), 3);
-    if (default_args != NULL)
+    if (!skip && default_args != NULL)
 	ga_init2(default_args, (int)sizeof(char_u *), 3);
 
     if (varargs != NULL)
@@ -289,24 +289,27 @@ get_function_args(
 		expr = p;
 		if (eval1(&p, &rettv, NULL) != FAIL)
 		{
-		    if (ga_grow(default_args, 1) == FAIL)
-			goto err_ret;
-
-		    // trim trailing whitespace
-		    while (p > expr && VIM_ISWHITE(p[-1]))
-			p--;
-		    c = *p;
-		    *p = NUL;
-		    expr = vim_strsave(expr);
-		    if (expr == NULL)
+		    if (!skip)
 		    {
+			if (ga_grow(default_args, 1) == FAIL)
+			    goto err_ret;
+
+			// trim trailing whitespace
+			while (p > expr && VIM_ISWHITE(p[-1]))
+			    p--;
+			c = *p;
+			*p = NUL;
+			expr = vim_strsave(expr);
+			if (expr == NULL)
+			{
+			    *p = c;
+			    goto err_ret;
+			}
+			((char_u **)(default_args->ga_data))
+						 [default_args->ga_len] = expr;
+			default_args->ga_len++;
 			*p = c;
-			goto err_ret;
 		    }
-		    ((char_u **)(default_args->ga_data))
-						 [default_args->ga_len] = expr;
-		    default_args->ga_len++;
-		    *p = c;
 		}
 		else
 		    mustend = TRUE;
@@ -357,7 +360,7 @@ get_function_args(
 err_ret:
     if (newargs != NULL)
 	ga_clear_strings(newargs);
-    if (default_args != NULL)
+    if (!skip && default_args != NULL)
 	ga_clear_strings(default_args);
     return FAIL;
 }
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3059,
+/**/
     3058,
 /**/
     3057,