summaryrefslogtreecommitdiffstats
path: root/src/tag.c
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2021-12-12 16:26:44 +0000
committerBram Moolenaar <Bram@vim.org>2021-12-12 16:26:44 +0000
commit6ae8fae8696623b527c7fb22567f6a3705b2f0dd (patch)
tree5013ad6590516571ae06f992906c4270d7f03b45 /src/tag.c
parent6e371ecb27227ff8fedd8561d0f3880a17576848 (diff)
patch 8.2.3788: lambda for option that is a function may be freedv8.2.3788
Problem: Lambda for option that is a function may be garbage collected. Solution: Set a reference in the funcref. (Yegappan Lakshmanan, closes #9330)
Diffstat (limited to 'src/tag.c')
-rw-r--r--src/tag.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/tag.c b/src/tag.c
index 48a69d466c..85d1438881 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -133,15 +133,31 @@ set_tagfunc_option(void)
return OK;
}
-# if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE) || defined(PROTO)
void
free_tagfunc_option(void)
{
-# ifdef FEAT_EVAL
+# ifdef FEAT_EVAL
free_callback(&tfu_cb);
-# endif
-}
# endif
+}
+#endif
+
+/*
+ * Mark the global 'tagfunc' callback with 'copyID' so that it is not garbage
+ * collected.
+ */
+ int
+set_ref_in_tagfunc(int copyID UNUSED)
+{
+ int abort = FALSE;
+
+#ifdef FEAT_EVAL
+ abort = set_ref_in_callback(&tfu_cb, copyID);
+#endif
+
+ return abort;
+}
/*
* Copy the global 'tagfunc' callback function to the buffer-local 'tagfunc'