diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-12-30 19:19:53 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-12-30 19:19:53 +0100 |
commit | 3fbcc128cbd2311819cc5a7bb89e45669860f008 (patch) | |
tree | b19f260ef8d85abbd8bc000900eb6ff145c563a6 | |
parent | d0337e360e9f0b51a1a5627239d80a45dee8c3be (diff) |
patch 8.2.0061: the execute stack can grow big and never shrinksv8.2.0061
Problem: The execute stack can grow big and never shrinks.
Solution: Reduce the size in gargage collect.
-rw-r--r-- | src/eval.c | 24 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/eval.c b/src/eval.c index c03372d1c9..739c73c9b6 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3857,6 +3857,30 @@ garbage_collect(int testing) garbage_collect_at_exit = FALSE; } + // The execution stack can grow big, limit the size. + if (exestack.ga_maxlen - exestack.ga_len > 500) + { + size_t new_len; + char_u *pp; + int n; + + // Keep 150% of the current size, with a minimum of the growth size. + 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) + { + new_len = exestack.ga_itemsize * (exestack.ga_len + n); + pp = vim_realloc(exestack.ga_data, new_len); + if (pp == NULL) + return FAIL; + exestack.ga_maxlen = exestack.ga_len + n; + exestack.ga_data = pp; + } + } + // We advance by two because we add one for items referenced through // previous_funccal. copyID = get_copyID(); diff --git a/src/version.c b/src/version.c index 3a22ca41d8..f68e29fe4f 100644 --- a/src/version.c +++ b/src/version.c @@ -743,6 +743,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 61, +/**/ 60, /**/ 59, |