Mercurial > vim
diff src/userfunc.c @ 27807:292a6bd86c30 v8.2.4429
patch 8.2.4429: using script-local function from the wrong script
Commit: https://github.com/vim/vim/commit/c2f17f7e64bb1bf872dbc6f3b8f0d8751e275287
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Feb 21 13:13:50 2022 +0000
patch 8.2.4429: using script-local function from the wrong script
Problem: Using script-local function from the wrong script when using a
partial. (Yegappan Lakshmanan)
Solution: Include the script ID in the partial name.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 21 Feb 2022 14:15:04 +0100 |
parents | 40ae50de0d27 |
children | 6a0ecde89d35 |
line wrap: on
line diff
--- a/src/userfunc.c +++ b/src/userfunc.c @@ -1958,17 +1958,29 @@ find_func_even_dead(char_u *name, int fl if ((flags & FFED_IS_GLOBAL) == 0) { - int find_script_local = in_vim9script() && eval_isnamec1(*name) - && (name[1] != ':' || *name == 's'); - - if (find_script_local) + // Find script-local function before global one. + if (in_vim9script() && eval_isnamec1(*name) + && (name[1] != ':' || *name == 's')) { - // Find script-local function before global one. func = find_func_with_sid(name[0] == 's' && name[1] == ':' ? name + 2 : name, current_sctx.sc_sid); if (func != NULL) return func; } + if (in_vim9script() && STRNCMP(name, "<SNR>", 5) == 0) + { + char_u *p = name + 5; + long sid; + + // printable "<SNR>123_Name" form + sid = getdigits(&p); + if (*p == '_') + { + func = find_func_with_sid(p + 1, (int)sid); + if (func != NULL) + return func; + } + } } if ((flags & FFED_NO_GLOBAL) == 0) @@ -4068,6 +4080,23 @@ get_scriptlocal_funcname(char_u *funcnam } /* + * Return script-local "fname" with the 3-byte sequence replaced by + * printable <SNR> in allocated memory. + */ + char_u * +alloc_printable_func_name(char_u *fname) +{ + char_u *n = alloc(STRLEN(fname + 3) + 6); + + if (n != NULL) + { + STRCPY(n, "<SNR>"); + STRCPY(n + 5, fname + 3); + } + return n; +} + +/* * Call trans_function_name(), except that a lambda is returned as-is. * Returns the name in allocated memory. */