Mercurial > vim
changeset 30423:221cca379bd5 v9.0.0547
patch 9.0.0547: looping over empty out_loop[] entries
Commit: https://github.com/vim/vim/commit/6d313bec535d9ccc24f6f82025280a61caad7416
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Sep 22 16:36:25 2022 +0100
patch 9.0.0547: looping over empty out_loop[] entries
Problem: Looping over empty out_loop[] entries.
Solution: Store the array size.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 22 Sep 2022 17:45:03 +0200 |
parents | 52b7188f13b1 |
children | 1a518a4bf1fd |
files | src/structs.h src/version.c src/vim9execute.c |
diffstat | 3 files changed, 9 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/structs.h +++ b/src/structs.h @@ -2126,6 +2126,7 @@ struct outer_S { // out_loop_stack short var_count; // number of variables defined in a loop } out_loop[MAX_LOOP_DEPTH]; + int out_loop_size; // nr of used entries in out_loop[] }; struct partial_S
--- a/src/version.c +++ b/src/version.c @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 547, +/**/ 546, /**/ 545,
--- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1868,7 +1868,10 @@ fill_partial_and_closure( pt->pt_outer.out_loop[depth].var_count = lvi->lvi_loop[depth].var_count; } + pt->pt_outer.out_loop_size = lvi->lvi_depth; } + else + pt->pt_outer.out_loop_size = 0; // If the function currently executing returns and the closure is still // being referenced, we need to make a copy of the context (arguments @@ -5739,14 +5742,10 @@ call_def_function( if (partial != NULL) { outer_T *outer = get_pt_outer(partial); - int depth; - void *ptr = outer->out_stack; - - // see if any stack was set - for (depth = 0; ptr == NULL && depth < MAX_LOOP_DEPTH; ++depth) - ptr = outer->out_loop[depth].stack; - if (ptr == NULL) + + if (outer->out_stack == NULL && outer->out_loop_size == 0) { + // no stack was set if (current_ectx != NULL) { if (current_ectx->ec_outer_ref != NULL