summaryrefslogtreecommitdiff
path: root/src/eval.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2006-09-03 13:34:00 +0000
committerBram Moolenaar <Bram@vim.org>2006-09-03 13:34:00 +0000
commitac48dbff439c030430e743cd97c914bcc3443270 (patch)
treebe4e41feae532dbff8afd96f0564e08c6cffc431 /src/eval.c
parent68c3174108bdc17c269128e15209c132046cf2c6 (diff)
downloadvim-git-ac48dbff439c030430e743cd97c914bcc3443270.tar.gz
updated for version 7.0-082v7.0.082
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/eval.c b/src/eval.c
index 0762cabac..162cdf4c7 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -248,6 +248,17 @@ struct funccall_S
};
/*
+ * Struct used to make a list of all arguments used in internal functions.
+ */
+typedef struct av_list_item_S av_list_item_T;
+struct av_list_item_S {
+ av_list_item_T *avl_next;
+ typval_T *avl_argvars;
+};
+
+av_list_item_T *argvars_list = NULL;
+
+/*
* Info used by a ":for" loop.
*/
typedef struct
@@ -6058,6 +6069,7 @@ garbage_collect()
int i;
funccall_T *fc;
int did_free = FALSE;
+ av_list_item_T *av;
#ifdef FEAT_WINDOWS
tabpage_T *tp;
#endif
@@ -6094,6 +6106,11 @@ garbage_collect()
set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID);
}
+ /* arguments for internal functions */
+ for (av = argvars_list; av != NULL; av = av->avl_next)
+ for (i = 0; av->avl_argvars[i].v_type != VAR_UNKNOWN; ++i)
+ set_ref_in_item(&av->avl_argvars[i], copyID);
+
/*
* 2. Go through the list of dicts and free items without the copyID.
*/
@@ -7537,9 +7554,21 @@ call_func(name, len, rettv, argcount, argvars, firstline, lastline,
error = ERROR_TOOMANY;
else
{
+ av_list_item_T av_list_item;
+
+ /* Add the arguments to the "argvars_list" to avoid the
+ * garbage collector not seeing them. This isn't needed
+ * for user functions, because the arguments are available
+ * in the a: hashtab. */
+ av_list_item.avl_argvars = argvars;
+ av_list_item.avl_next = argvars_list;
+ argvars_list = &av_list_item;
+
argvars[argcount].v_type = VAR_UNKNOWN;
functions[i].f_func(argvars, rettv);
error = ERROR_NONE;
+
+ argvars_list = av_list_item.avl_next;
}
}
}