summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-12-30 19:19:53 +0100
committerBram Moolenaar <Bram@vim.org>2019-12-30 19:19:53 +0100
commit3fbcc128cbd2311819cc5a7bb89e45669860f008 (patch)
treeb19f260ef8d85abbd8bc000900eb6ff145c563a6
parentd0337e360e9f0b51a1a5627239d80a45dee8c3be (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.c24
-rw-r--r--src/version.c2
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,