Mercurial > vim
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) |