Mercurial > vim
diff src/userfunc.c @ 26348:bf1a7ce3f14a v8.2.3705
patch 8.2.3705: cannot pass a lambda name to function() or funcref()
Commit: https://github.com/vim/vim/commit/eba3b7f6645c8f856132b4c06a009a3b0a44e21c
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Nov 30 18:25:08 2021 +0000
patch 8.2.3705: cannot pass a lambda name to function() or funcref()
Problem: Cannot pass a lambda name to function() or funcref(). (Yegappan
Lakshmanan)
Solution: Handle a lambda name differently.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 30 Nov 2021 19:30:05 +0100 |
parents | 3841da4eac23 |
children | 8aba638e91eb |
line wrap: on
line diff
--- a/src/userfunc.c +++ b/src/userfunc.c @@ -3811,6 +3811,36 @@ untrans_function_name(char_u *name) } /* + * Call trans_function_name(), except that a lambda is returned as-is. + * Returns the name in allocated memory. + */ + char_u * +save_function_name( + char_u **name, + int *is_global, + int skip, + int flags, + funcdict_T *fudi) +{ + char_u *p = *name; + char_u *saved; + + if (STRNCMP(p, "<lambda>", 8) == 0) + { + p += 8; + (void)getdigits(&p); + saved = vim_strnsave(*name, p - *name); + if (fudi != NULL) + CLEAR_POINTER(fudi); + } + else + saved = trans_function_name(&p, is_global, skip, + flags, fudi, NULL, NULL); + *name = p; + return saved; +} + +/* * List functions. When "regmatch" is NULL all of then. * Otherwise functions matching "regmatch". */ @@ -3950,16 +3980,8 @@ define_function(exarg_T *eap, char_u *na } else { - if (STRNCMP(p, "<lambda>", 8) == 0) - { - p += 8; - (void)getdigits(&p); - name = vim_strnsave(eap->arg, p - eap->arg); - CLEAR_FIELD(fudi); - } - else - name = trans_function_name(&p, &is_global, eap->skip, - TFN_NO_AUTOLOAD, &fudi, NULL, NULL); + name = save_function_name(&p, &is_global, eap->skip, + TFN_NO_AUTOLOAD, &fudi); paren = (vim_strchr(p, '(') != NULL); if (name == NULL && (fudi.fd_dict == NULL || !paren) && !eap->skip) {