vim-patch:8.2.0061: the execute stack can grow big and never shrinks

Problem:    The execute stack can grow big and never shrinks.
Solution:   Reduce the size in gargage collect.
3fbcc128cb
This commit is contained in:
zeertzjq 2022-08-13 15:44:15 +08:00
parent ded2925b40
commit de72f9098a

View File

@ -4188,6 +4188,23 @@ bool garbage_collect(bool testing)
garbage_collect_at_exit = false; garbage_collect_at_exit = false;
} }
// The execution stack can grow big, limit the size.
if (exestack.ga_maxlen - exestack.ga_len > 500) {
// Keep 150% of the current size, with a minimum of the growth size.
int n = exestack.ga_len / 2;
if (n < exestack.ga_growsize) {
n = exestack.ga_growsize;
}
// Don't make it bigger though.
if (exestack.ga_len + n < exestack.ga_maxlen) {
size_t new_len = (size_t)exestack.ga_itemsize * (size_t)(exestack.ga_len + n);
char *pp = xrealloc(exestack.ga_data, new_len);
exestack.ga_maxlen = exestack.ga_len + n;
exestack.ga_data = pp;
}
}
// We advance by two (COPYID_INC) because we add one for items referenced // We advance by two (COPYID_INC) because we add one for items referenced
// through previous_funccal. // through previous_funccal.
const int copyID = get_copyID(); const int copyID = get_copyID();