# HG changeset patch # User Bram Moolenaar # Date 1663861503 -7200 # Node ID 221cca379bd5daa63bf08597801e7e15ee2d0187 # Parent 52b7188f13b146ed6a99f14d94cb557899aa1bcd patch 9.0.0547: looping over empty out_loop[] entries Commit: https://github.com/vim/vim/commit/6d313bec535d9ccc24f6f82025280a61caad7416 Author: Bram Moolenaar 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. diff --git a/src/structs.h b/src/structs.h --- 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 diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/vim9execute.c b/src/vim9execute.c --- 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