Mercurial > vim
changeset 29301:fb375f0c6ea7 v8.2.5167
patch 8.2.5167: get(Fn, 'name') on funcref returns special byte code
Commit: https://github.com/vim/vim/commit/1ae8c262df7083dfb4b41485508951c50eccc84c
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Jun 27 11:45:52 2022 +0100
patch 8.2.5167: get(Fn, 'name') on funcref returns special byte code
Problem: get(Fn, 'name') on funcref returns special byte code.
Solution: Use the printable name.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 27 Jun 2022 13:00:07 +0200 |
parents | 70a0db5f366d |
children | 8b8aafbda944 |
files | src/evalfunc.c src/testdir/test_getvar.vim src/version.c |
diffstat | 3 files changed, 20 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -4719,19 +4719,23 @@ f_get(typval_T *argvars, typval_T *rettv if (pt != NULL) { char_u *what = tv_get_string(&argvars[1]); - char_u *n; if (STRCMP(what, "func") == 0 || STRCMP(what, "name") == 0) { + char_u *name = partial_name(pt); + rettv->v_type = (*what == 'f' ? VAR_FUNC : VAR_STRING); - n = partial_name(pt); - if (n == NULL) + if (name == NULL) rettv->vval.v_string = NULL; else { - rettv->vval.v_string = vim_strsave(n); if (rettv->v_type == VAR_FUNC) - func_ref(rettv->vval.v_string); + func_ref(name); + if (*what == 'n' && pt->pt_name == NULL + && pt->pt_func != NULL) + // use <SNR> instead of the byte code + name = printable_func_name(pt->pt_func); + rettv->vval.v_string = vim_strsave(name); } } else if (STRCMP(what, "dict") == 0)
--- a/src/testdir/test_getvar.vim +++ b/src/testdir/test_getvar.vim @@ -134,11 +134,20 @@ func Test_get_lambda() call assert_equal([], get(l:L, 'args')) endfunc +func s:FooBar() +endfunc + " get({func}, {what} [, {default}]) func Test_get_func() let l:F = function('tr') call assert_equal('tr', get(l:F, 'name')) call assert_equal(l:F, get(l:F, 'func')) + + let Fb_func = function('s:FooBar') + call assert_match('<SNR>\d\+_FooBar', get(Fb_func, 'name')) + let Fb_ref = funcref('s:FooBar') + call assert_match('<SNR>\d\+_FooBar', get(Fb_ref, 'name')) + call assert_equal({'func has': 'no dict'}, get(l:F, 'dict', {'func has': 'no dict'})) call assert_equal(0, get(l:F, 'dict')) call assert_equal([], get(l:F, 'args'))