Mercurial > vim
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)