summaryrefslogtreecommitdiff
path: root/src/eval.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-07-11 22:41:15 +0200
committerBram Moolenaar <Bram@vim.org>2016-07-11 22:41:15 +0200
commit1436d8d51cce114be56209924fc71376407e5bad (patch)
treec6ba6f27b14db303429e2e50ce3645ed865a765c /src/eval.c
parentda3a77d9ec28407b8fa2aa014e76944d0a525662 (diff)
downloadvim-git-1436d8d51cce114be56209924fc71376407e5bad.tar.gz
patch 7.4.2026v7.4.2026
Problem: Reference counting for callbacks isn't right. Solution: Add free_callback(). (Ken Takata) Fix reference count.
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/eval.c b/src/eval.c
index a9504363d..779886431 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -21178,13 +21178,33 @@ get_callback(typval_T *arg, partial_T **pp)
return (*pp)->pt_name;
}
*pp = NULL;
- if (arg->v_type == VAR_FUNC || arg->v_type == VAR_STRING)
+ if (arg->v_type == VAR_FUNC)
+ {
+ func_ref(arg->vval.v_string);
+ return arg->vval.v_string;
+ }
+ if (arg->v_type == VAR_STRING)
return arg->vval.v_string;
if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0)
return (char_u *)"";
EMSG(_("E921: Invalid callback argument"));
return NULL;
}
+
+/*
+ * Unref/free "callback" and "partial" retured by get_callback().
+ */
+ void
+free_callback(char_u *callback, partial_T *partial)
+{
+ if (partial != NULL)
+ partial_unref(partial);
+ else if (callback != NULL)
+ {
+ func_unref(callback);
+ vim_free(callback);
+ }
+}
#endif
#ifdef FEAT_TIMERS