diff src/eval.c @ 9491:404de131cff9 v7.4.2026

commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jul 11 22:41:15 2016 +0200 patch 7.4.2026 Problem: Reference counting for callbacks isn't right. Solution: Add free_callback(). (Ken Takata) Fix reference count.
author Christian Brabandt <cb@256bit.org>
date Mon, 11 Jul 2016 22:45:05 +0200
parents 69ed2c9d34a6
children 9225961006a4
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -21178,13 +21178,33 @@ get_callback(typval_T *arg, partial_T **
 	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