diff src/eval.c @ 357:25dd5036f2b0 v7.0092

updated for version 7.0092
author vimboss
date Fri, 24 Jun 2005 23:11:15 +0000
parents 7033303ea0c0
children 6c62b9b939bd
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -708,6 +708,32 @@ eval_init()
     }
 }
 
+#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 @@ ex_function(eap)
 
 	/* 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 @@ find_func(name)
     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.
  */