updated for version 7.0092
diff --git a/src/eval.c b/src/eval.c
index fb07e5e..dc38936 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -708,6 +708,32 @@
}
}
+#if defined(EXITFREE) || defined(PROTO)
+ void
+eval_clear()
+{
+ int i;
+ struct vimvar *p;
+
+ for (i = 0; i < VV_LEN; ++i)
+ {
+ p = &vimvars[i];
+ if (p->vv_di.di_tv.v_type == VAR_STRING)
+ vim_free(p->vv_di.di_tv.vval.v_string);
+ }
+ hash_clear(&vimvarht);
+ hash_clear(&compat_hashtab);
+
+ /* script-local variables */
+ for (i = 1; i <= ga_scripts.ga_len; ++i)
+ vars_clear(&SCRIPT_VARS(i));
+ ga_clear(&ga_scripts);
+
+ /* global variables */
+ vars_clear(&globvarht);
+}
+#endif
+
/*
* Return the name of the executed function.
*/
@@ -16406,7 +16432,21 @@
/* Add the line to the function. */
if (ga_grow(&newlines, 1) == FAIL)
+ {
+ vim_free(theline);
goto erret;
+ }
+
+ /* Copy the line to newly allocated memory. get_one_sourceline()
+ * allocates 250 bytes per line, this saves 80% on average. The cost
+ * is an extra alloc/free. */
+ p = vim_strsave(theline);
+ if (p != NULL)
+ {
+ vim_free(theline);
+ theline = p;
+ }
+
((char_u **)(newlines.ga_data))[newlines.ga_len] = theline;
newlines.ga_len++;
}
@@ -16808,6 +16848,24 @@
return NULL;
}
+#if defined(EXITFREE) || defined(PROTO)
+ void
+free_all_functions()
+{
+ 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));
+ break;
+ }
+}
+#endif
+
/*
* Return TRUE if a function "name" exists.
*/
diff --git a/src/proto/ex_cmds2.pro b/src/proto/ex_cmds2.pro
index 4914a44..66584f5 100644
--- a/src/proto/ex_cmds2.pro
+++ b/src/proto/ex_cmds2.pro
@@ -61,6 +61,7 @@
int *source_dbg_tick __ARGS((void *cookie));
int source_level __ARGS((void *cookie));
int do_source __ARGS((char_u *fname, int check_other, int is_vimrc));
+void free_scriptnames __ARGS((void));
void ex_scriptnames __ARGS((exarg_T *eap));
void scriptnames_slash_adjust __ARGS((void));
char_u *get_scriptname __ARGS((scid_T id));
diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro
index 6d79631..936f38f 100644
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -24,6 +24,7 @@
char_u *lalloc __ARGS((long_u size, int message));
void *mem_realloc __ARGS((void *ptr, size_t size));
void do_outofmem_msg __ARGS((long_u size));
+void free_all_mem __ARGS((void));
char_u *vim_strsave __ARGS((char_u *string));
char_u *vim_strnsave __ARGS((char_u *string, int len));
char_u *vim_strsave_escaped __ARGS((char_u *string, char_u *esc_chars));
diff --git a/src/proto/screen.pro b/src/proto/screen.pro
index 6831d42..b5b6eec 100644
--- a/src/proto/screen.pro
+++ b/src/proto/screen.pro
@@ -29,6 +29,7 @@
void check_for_delay __ARGS((int check_msg_scroll));
int screen_valid __ARGS((int clear));
void screenalloc __ARGS((int clear));
+void free_screenlines __ARGS((void));
void screenclear __ARGS((void));
int can_clear __ARGS((char_u *p));
void screen_start __ARGS((void));