mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
patch 9.0.0535: closure gets wrong value in for loop with two loop variables
Problem: Closure gets wrong value in for loop with two loop variables. Solution: Correctly compute the number of loop variables to clear.
This commit is contained in:
@@ -1315,7 +1315,7 @@ skip_var_list(
|
|||||||
}
|
}
|
||||||
return p + 1;
|
return p + 1;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
return skip_var_one(arg, include_type);
|
return skip_var_one(arg, include_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1240,8 +1240,14 @@ ex_while(exarg_T *eap)
|
|||||||
// variable that we reuse every time around.
|
// variable that we reuse every time around.
|
||||||
// Do this backwards, so that vars defined in a later round are
|
// Do this backwards, so that vars defined in a later round are
|
||||||
// found first.
|
// found first.
|
||||||
first = cstack->cs_script_var_len[cstack->cs_idx]
|
first = cstack->cs_script_var_len[cstack->cs_idx];
|
||||||
+ (eap->cmdidx == CMD_while ? 0 : 1);
|
if (eap->cmdidx == CMD_for)
|
||||||
|
{
|
||||||
|
forinfo_T *fi = cstack->cs_forinfo[cstack->cs_idx];
|
||||||
|
|
||||||
|
first += fi == NULL || fi->fi_varcount == 0
|
||||||
|
? 1 : fi->fi_varcount;
|
||||||
|
}
|
||||||
for (i = si->sn_var_vals.ga_len - 1; i >= first; --i)
|
for (i = si->sn_var_vals.ga_len - 1; i >= first; --i)
|
||||||
{
|
{
|
||||||
svar_T *sv = ((svar_T *)si->sn_var_vals.ga_data) + i;
|
svar_T *sv = ((svar_T *)si->sn_var_vals.ga_data) + i;
|
||||||
|
@@ -1630,7 +1630,7 @@ typedef struct svar_S svar_T;
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int fi_semicolon; // TRUE if ending in '; var]'
|
int fi_semicolon; // TRUE if ending in '; var]'
|
||||||
int fi_varcount; // nr of variables in the list
|
int fi_varcount; // nr of variables in [] or zero
|
||||||
int fi_break_count; // nr of line breaks encountered
|
int fi_break_count; // nr of line breaks encountered
|
||||||
listwatch_T fi_lw; // keep an eye on the item used.
|
listwatch_T fi_lw; // keep an eye on the item used.
|
||||||
list_T *fi_list; // list being used
|
list_T *fi_list; // list being used
|
||||||
|
@@ -2323,6 +2323,27 @@ def Test_for_loop_with_closure()
|
|||||||
endfor
|
endfor
|
||||||
END
|
END
|
||||||
v9.CheckDefAndScriptSuccess(lines)
|
v9.CheckDefAndScriptSuccess(lines)
|
||||||
|
|
||||||
|
# using two loop variables
|
||||||
|
lines =<< trim END
|
||||||
|
var lv_list: list<func>
|
||||||
|
var copy_list: list<func>
|
||||||
|
for [idx, c] in items('word')
|
||||||
|
var lidx = idx
|
||||||
|
var lc = c
|
||||||
|
lv_list[idx] = () => {
|
||||||
|
return idx .. c
|
||||||
|
}
|
||||||
|
copy_list[idx] = () => {
|
||||||
|
return lidx .. lc
|
||||||
|
}
|
||||||
|
endfor
|
||||||
|
for [i, c] in items('word')
|
||||||
|
assert_equal(3 .. 'd', lv_list[i]())
|
||||||
|
assert_equal(i .. c, copy_list[i]())
|
||||||
|
endfor
|
||||||
|
END
|
||||||
|
v9.CheckDefAndScriptSuccess(lines)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_define_global_closure_in_loops()
|
def Test_define_global_closure_in_loops()
|
||||||
|
@@ -699,6 +699,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
535,
|
||||||
/**/
|
/**/
|
||||||
534,
|
534,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user