Patch 7.4.2197
Problem: All functions are freed on exit, which may hide leaks.
Solution: Only free named functions, not reference counted ones.
Files: src/userfunc.c
*** ../vim-7.4.2196/src/userfunc.c 2016-08-01 22:49:18.065145186 +0200
--- src/userfunc.c 2016-08-11 22:15:52.452703436 +0200
***************
*** 1099,1120 ****
vim_free(fp);
}
#if defined(EXITFREE) || defined(PROTO)
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)
if (!HASHITEM_EMPTY(hi))
{
! func_free(HI2UF(hi), TRUE);
! break;
}
! hash_clear(&func_hashtab);
}
#endif
--- 1099,1151 ----
vim_free(fp);
}
+ /*
+ * There are two kinds of function names:
+ * 1. ordinary names, function defined with :function
+ * 2. numbered functions and lambdas
+ * For the first we only count the name stored in func_hashtab as a reference,
+ * using function() does not count as a reference, because the function is
+ * looked up by name.
+ */
+ static int
+ func_name_refcount(char_u *name)
+ {
+ return isdigit(*name) || *name == '<';
+ }
+
#if defined(EXITFREE) || defined(PROTO)
void
free_all_functions(void)
{
hashitem_T *hi;
+ ufunc_T *fp;
+ long_u skipped = 0;
+ long_u 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
! * supposed to be freed when no longer referenced. */
! fp = HI2UF(hi);
! if (func_name_refcount(fp->uf_name))
! ++skipped;
! else
! {
! func_free(fp, TRUE);
! skipped = 0;
! break;
! }
}
! }
! if (skipped == 0)
! hash_clear(&func_hashtab);
}
#endif
***************
*** 1669,1688 ****
}
/*
- * There are two kinds of function names:
- * 1. ordinary names, function defined with :function
- * 2. numbered functions and lambdas
- * For the first we only count the name stored in func_hashtab as a reference,
- * using function() does not count as a reference, because the function is
- * looked up by name.
- */
- static int
- func_name_refcount(char_u *name)
- {
- return isdigit(*name) || *name == '<';
- }
-
- /*
* ":function"
*/
void
--- 1700,1705 ----
*** ../vim-7.4.2196/src/version.c 2016-08-10 23:02:42.499155800 +0200
--- src/version.c 2016-08-11 22:20:49.922041422 +0200
***************
*** 765,766 ****
--- 765,768 ----
{ /* Add new patch number below this line */
+ /**/
+ 2197,
/**/
--
hundred-and-one symptoms of being an internet addict:
5. You find yourself brainstorming for new subjects to search.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.