patch 8.2.4030: a script local funcref is not found from a mapping
Problem: A script local funcref is not found from a mapping.
Solution: When looking for a function, also find a script-local funcref.
(closes #9485)
diff --git a/src/evalvars.c b/src/evalvars.c
index 730c7d1..965b204 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -2690,7 +2690,7 @@
{
if ((flags & EVAL_VAR_IMPORT) == 0)
{
- if (sid != 0 && SCRIPT_ID_VALID(sid))
+ if (SCRIPT_ID_VALID(sid))
{
ht = &SCRIPT_VARS(sid);
if (ht != NULL)
@@ -2878,6 +2878,35 @@
}
/*
+ * Like find_var() but if the name starts with <SNR>99_ then look in the
+ * referenced script (used for a funcref).
+ */
+ dictitem_T *
+find_var_also_in_script(char_u *name, hashtab_T **htp, int no_autoload)
+{
+ if (STRNCMP(name, "<SNR>", 5) == 0 && isdigit(name[5]))
+ {
+ char_u *p = name + 5;
+ int sid = getdigits(&p);
+
+ if (SCRIPT_ID_VALID(sid) && *p == '_')
+ {
+ hashtab_T *ht = &SCRIPT_VARS(sid);
+
+ if (ht != NULL)
+ {
+ dictitem_T *di = find_var_in_ht(ht, 0, p + 1, no_autoload);
+
+ if (di != NULL)
+ return di;
+ }
+ }
+ }
+
+ return find_var(name, htp, no_autoload);
+}
+
+/*
* Find variable "varname" in hashtab "ht" with name "htname".
* When "varname" is empty returns curwin/curtab/etc vars dictionary.
* Returns NULL if not found.