comparison src/option.c @ 26618:b531c26f728b v8.2.3838

patch 8.2.3838: cannot use script-local function for setting *func options Commit: https://github.com/vim/vim/commit/db1a410b610b2c1941311acc57dcc4afec20720e Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Fri Dec 17 16:21:20 2021 +0000 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 https://github.com/vim/vim/issues/9362)
author Bram Moolenaar <Bram@vim.org>
date Fri, 17 Dec 2021 17:30:04 +0100
parents 6fed1f1bc282
children 9c9b8d95b05f
comparison
equal deleted inserted replaced
26617:86ca0d6a6a34 26618:b531c26f728b
7197 { 7197 {
7198 free_callback(optcb); 7198 free_callback(optcb);
7199 return OK; 7199 return OK;
7200 } 7200 }
7201 7201
7202 if (STRNCMP(optval, "s:", 2) == 0 && !SCRIPT_ID_VALID(current_sctx.sc_sid))
7203 return FAIL;
7204
7205 if (*optval == '{' || (in_vim9script() && *optval == '(') 7202 if (*optval == '{' || (in_vim9script() && *optval == '(')
7206 || (STRNCMP(optval, "function(", 9) == 0) 7203 || (STRNCMP(optval, "function(", 9) == 0)
7207 || (STRNCMP(optval, "funcref(", 8) == 0)) 7204 || (STRNCMP(optval, "funcref(", 8) == 0))
7208 // Lambda expression or a funcref 7205 // Lambda expression or a funcref
7209 tv = eval_expr(optval, NULL); 7206 tv = eval_expr(optval, NULL);
7210 else 7207 else
7208 {
7211 // treat everything else as a function name string 7209 // treat everything else as a function name string
7212 tv = alloc_string_tv(vim_strsave(optval)); 7210
7211 // Function name starting with "s:" are supported only in a vimscript
7212 // context.
7213 if (STRNCMP(optval, "s:", 2) == 0)
7214 {
7215 char sid_buf[25];
7216 char_u *funcname;
7217
7218 if (!SCRIPT_ID_VALID(current_sctx.sc_sid))
7219 {
7220 emsg(_(e_using_sid_not_in_script_context));
7221 return FAIL;
7222 }
7223 // Expand s: prefix into <SNR>nr_<name>
7224 sprintf(sid_buf, "<SNR>%ld_", (long)current_sctx.sc_sid);
7225 funcname = alloc(STRLEN(sid_buf) + STRLEN(optval + 2) + 1);
7226 if (funcname == NULL)
7227 return FAIL;
7228 STRCPY(funcname, sid_buf);
7229 STRCAT(funcname, optval + 2);
7230 tv = alloc_string_tv(funcname);
7231 }
7232 else
7233 tv = alloc_string_tv(vim_strsave(optval));
7234 }
7213 if (tv == NULL) 7235 if (tv == NULL)
7214 return FAIL; 7236 return FAIL;
7215 7237
7216 cb = get_callback(tv); 7238 cb = get_callback(tv);
7217 if (cb.cb_name == NULL || *cb.cb_name == NUL) 7239 if (cb.cb_name == NULL || *cb.cb_name == NUL)