mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.0882: leaking memory when using reduce()
Problem: Leaking memory when using reduce().
Solution: Free the intermediate value.
48b1c21809
This commit is contained in:
parent
d746f5aa41
commit
af0bae38e2
@ -7882,7 +7882,7 @@ static void f_reduce(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
funcexe.evaluate = true;
|
funcexe.evaluate = true;
|
||||||
funcexe.partial = partial;
|
funcexe.partial = partial;
|
||||||
|
|
||||||
typval_T accum;
|
typval_T initial;
|
||||||
typval_T argv[3];
|
typval_T argv[3];
|
||||||
if (argvars[0].v_type == VAR_LIST) {
|
if (argvars[0].v_type == VAR_LIST) {
|
||||||
const list_T *const l = argvars[0].vval.v_list;
|
const list_T *const l = argvars[0].vval.v_list;
|
||||||
@ -7894,21 +7894,23 @@ static void f_reduce(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const listitem_T *const first = tv_list_first(l);
|
const listitem_T *const first = tv_list_first(l);
|
||||||
accum = *TV_LIST_ITEM_TV(first);
|
initial = *TV_LIST_ITEM_TV(first);
|
||||||
li = TV_LIST_ITEM_NEXT(l, first);
|
li = TV_LIST_ITEM_NEXT(l, first);
|
||||||
} else {
|
} else {
|
||||||
accum = argvars[2];
|
initial = argvars[2];
|
||||||
li = tv_list_first(l);
|
li = tv_list_first(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
tv_copy(&accum, rettv);
|
tv_copy(&initial, rettv);
|
||||||
for (; li != NULL; li = TV_LIST_ITEM_NEXT(l, li)) {
|
for (; li != NULL; li = TV_LIST_ITEM_NEXT(l, li)) {
|
||||||
argv[0] = accum;
|
argv[0] = *rettv;
|
||||||
argv[1] = *TV_LIST_ITEM_TV(li);
|
argv[1] = *TV_LIST_ITEM_TV(li);
|
||||||
if (call_func(func_name, -1, rettv, 2, argv, &funcexe) == FAIL) {
|
rettv->v_type = VAR_UNKNOWN;
|
||||||
|
const int r = call_func(func_name, -1, rettv, 2, argv, &funcexe);
|
||||||
|
tv_clear(&argv[0]);
|
||||||
|
if (r == FAIL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
accum = *rettv;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const blob_T *const b = argvars[0].vval.v_blob;
|
const blob_T *const b = argvars[0].vval.v_blob;
|
||||||
@ -7919,23 +7921,25 @@ static void f_reduce(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
semsg(_(e_reduceempty), "Blob");
|
semsg(_(e_reduceempty), "Blob");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
accum.v_type = VAR_NUMBER;
|
initial.v_type = VAR_NUMBER;
|
||||||
accum.vval.v_number = tv_blob_get(b, 0);
|
initial.vval.v_number = tv_blob_get(b, 0);
|
||||||
i = 1;
|
i = 1;
|
||||||
|
} else if (argvars[2].v_type != VAR_NUMBER) {
|
||||||
|
emsg(_(e_number_exp));
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
accum = argvars[2];
|
initial = argvars[2];
|
||||||
i = 0;
|
i = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
tv_copy(&accum, rettv);
|
tv_copy(&initial, rettv);
|
||||||
for (; i < tv_blob_len(b); i++) {
|
for (; i < tv_blob_len(b); i++) {
|
||||||
argv[0] = accum;
|
argv[0] = *rettv;
|
||||||
argv[1].v_type = VAR_NUMBER;
|
argv[1].v_type = VAR_NUMBER;
|
||||||
argv[1].vval.v_number = tv_blob_get(b, i);
|
argv[1].vval.v_number = tv_blob_get(b, i);
|
||||||
if (call_func(func_name, -1, rettv, 2, argv, &funcexe) == FAIL) {
|
if (call_func(func_name, -1, rettv, 2, argv, &funcexe) == FAIL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
accum = *rettv;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user