aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Ennen <mike.ennen@gmail.com>2016-12-16 15:16:55 -0700
committerMichael Ennen <mike.ennen@gmail.com>2017-02-14 17:38:18 -0700
commit8cae66b5e04467322b3dcd20d0a998d9f327efb9 (patch)
treec7d81fc181e4b00a792f1752e9143bf8f1434747
parente2f76d190d5d7c6bf54fa1d8ee32d88d0a1169cb (diff)
downloadrneovim-8cae66b5e04467322b3dcd20d0a998d9f327efb9.tar.gz
rneovim-8cae66b5e04467322b3dcd20d0a998d9f327efb9.tar.bz2
rneovim-8cae66b5e04467322b3dcd20d0a998d9f327efb9.zip
vim-patch:7.4.2197
Problem: All functions are freed on exit, which may hide leaks. Solution: Only free named functions, not reference counted ones. https://github.com/vim/vim/commit/c257487035f83aabe1c7e07f0552309e98f1bcb1
-rw-r--r--src/nvim/eval.c19
-rw-r--r--src/nvim/version.c2
2 files changed, 15 insertions, 6 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 8ce9c7712a..068a1b8ed4 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -21781,11 +21781,15 @@ ufunc_T *find_func(char_u *name)
void free_all_functions(void)
{
hashitem_T *hi;
-
- /* Need to start all over every time, because func_free() may change the
- * hash table. */
- while (func_hashtab.ht_used > 0)
- for (hi = func_hashtab.ht_array;; ++hi)
+ ufunc_T *fp;
+ uint64_t skipped = 0;
+ uint64_t todo;
+
+ // Need to start all over every time, because func_free() may change the
+ // hash table.
+ while (func_hashtab.ht_used > skipped) {
+ todo = func_hashtab.ht_used;
+ for (hi = func_hashtab.ht_array; todo > 0; hi++) {
if (!HASHITEM_EMPTY(hi)) {
todo--;
// Only free functions that are not refcounted, those are
@@ -21799,6 +21803,11 @@ void free_all_functions(void)
break;
}
}
+ }
+ }
+ if (skipped == 0) {
+ hash_clear(&func_hashtab);
+ }
}
#endif
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 89cd61fc6e..88c54756d2 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -243,7 +243,7 @@ static int included_patches[] = {
// 2200,
// 2199 NA
// 2198 NA
- // 2197,
+ 2197,
// 2196,
// 2195 NA
2194,