vim-patch:8.2.3838: cannot use script-local function for setting *func options

Problem:    Cannot use script-local function for setting *func options.
Solution:   Use the script context. (Yegappan Lakshmanan, closes vim/vim#9362)

db1a410b61

Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
This commit is contained in:
zeertzjq
2022-12-02 20:47:52 +08:00
parent 1aad5af637
commit 7d10194426
5 changed files with 274 additions and 26 deletions

View File

@@ -5157,10 +5157,6 @@ int option_set_callback_func(char *optval, Callback *optcb)
return OK;
}
if (strncmp(optval, "s:", 2) == 0 && !SCRIPT_ID_VALID(current_sctx.sc_sid)) {
return FAIL;
}
typval_T *tv;
if (*optval == '{'
|| (strncmp(optval, "function(", 9) == 0)
@@ -5174,7 +5170,26 @@ int option_set_callback_func(char *optval, Callback *optcb)
// treat everything else as a function name string
tv = xcalloc(1, sizeof(*tv));
tv->v_type = VAR_STRING;
tv->vval.v_string = xstrdup(optval);
// Function name starting with "s:" are supported only in a vimscript
// context.
if (strncmp(optval, "s:", 2) == 0) {
char sid_buf[25];
if (!SCRIPT_ID_VALID(current_sctx.sc_sid)) {
emsg(_(e_usingsid));
return FAIL;
}
// Expand s: prefix into <SNR>nr_<name>
snprintf(sid_buf, sizeof(sid_buf), "<SNR>%" PRId64 "_",
(int64_t)current_sctx.sc_sid);
char *funcname = xmalloc(strlen(sid_buf) + strlen(optval + 2) + 1);
STRCPY(funcname, sid_buf);
STRCAT(funcname, optval + 2);
tv->vval.v_string = funcname;
} else {
tv->vval.v_string = xstrdup(optval);
}
}
Callback cb;