patch 9.0.0481: in :def function all closures in loop get the same variables
Problem: In a :def function all closures in a loop get the same variables.
Solution: Use a separate list of variables for LOADOUTER and STOREOUTER.
Not copied at end of loop yet.
diff --git a/src/vim9expr.c b/src/vim9expr.c
index 3da556c..4406ac4 100644
--- a/src/vim9expr.c
+++ b/src/vim9expr.c
@@ -496,6 +496,7 @@
int idx;
int gen_load = FALSE;
int gen_load_outer = 0;
+ int outer_loop_idx = -1;
name = vim_strnsave(*arg, end - *arg);
if (name == NULL)
@@ -520,6 +521,7 @@
{
type = lvar.lv_type;
idx = lvar.lv_idx;
+ outer_loop_idx = lvar.lv_loop_idx;
if (lvar.lv_from_outer != 0)
gen_load_outer = lvar.lv_from_outer;
else
@@ -544,7 +546,8 @@
res = generate_LOAD(cctx, ISN_LOAD, idx, NULL, type);
if (gen_load_outer > 0)
{
- res = generate_LOADOUTER(cctx, idx, gen_load_outer, type);
+ res = generate_LOADOUTER(cctx, idx,
+ gen_load_outer, outer_loop_idx, type);
cctx->ctx_outer_used = TRUE;
}
}