diff src/vim9compile.c @ 22537:9870e8b6ed78 v8.2.1817

patch 8.2.1817: Vim9: wrong instruction when reusing a local variable spot Commit: https://github.com/vim/vim/commit/e8211a33dcb0ac6e29aad6699160fdc2e5fa2024 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Oct 9 22:04:29 2020 +0200 patch 8.2.1817: Vim9: wrong instruction when reusing a local variable spot Problem: Vim9: wrong instruction when reusing a local variable spot. Solution: Clear a newly allocated local variable. (closes https://github.com/vim/vim/issues/7080)
author Bram Moolenaar <Bram@vim.org>
date Fri, 09 Oct 2020 22:15:03 +0200
parents ac8c4a8b8cba
children c271498e03b2
line wrap: on
line diff
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -1690,7 +1690,12 @@ generate_EXECCONCAT(cctx_T *cctx, int co
  * Return the variable or NULL if it failed.
  */
     static lvar_T *
-reserve_local(cctx_T *cctx, char_u *name, size_t len, int isConst, type_T *type)
+reserve_local(
+	cctx_T	*cctx,
+	char_u	*name,
+	size_t	len,
+	int	isConst,
+	type_T	*type)
 {
     lvar_T  *lvar;
 
@@ -1703,6 +1708,7 @@ reserve_local(cctx_T *cctx, char_u *name
     if (ga_grow(&cctx->ctx_locals, 1) == FAIL)
 	return NULL;
     lvar = ((lvar_T *)cctx->ctx_locals.ga_data) + cctx->ctx_locals.ga_len++;
+    CLEAR_POINTER(lvar);
 
     // Every local variable uses the next entry on the stack.  We could re-use
     // the last ones when leaving a scope, but then variables used in a closure
@@ -4438,7 +4444,6 @@ compile_nested_function(exarg_T *eap, cc
     char_u	*name_start = eap->arg;
     char_u	*name_end = to_name_end(eap->arg, TRUE);
     char_u	*lambda_name;
-    lvar_T	*lvar;
     ufunc_T	*ufunc;
     int		r;
 
@@ -4487,8 +4492,9 @@ compile_nested_function(exarg_T *eap, cc
     else
     {
 	// Define a local variable for the function reference.
-	lvar = reserve_local(cctx, name_start, name_end - name_start,
+	lvar_T	*lvar = reserve_local(cctx, name_start, name_end - name_start,
 						    TRUE, ufunc->uf_func_type);
+
 	if (lvar == NULL)
 	    return NULL;
 	if (generate_FUNCREF(cctx, ufunc) == FAIL)