From b15cf44c1d9c92a2ac07cff415071e31a9ad88fa Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 16 Dec 2021 15:49:43 +0000 Subject: patch 8.2.3826: Vim9: using "g:Func" as funcref doesn't work in :def function Problem: Vim9: using "g:Func" as a funcref does not work in a :def function. Solution: Include "g:" in the function name. (closes #9336) --- src/testdir/test_vim9_disassemble.vim | 2 +- src/testdir/test_vim9_func.vim | 12 ++++++++++++ src/version.c | 2 ++ src/vim9compile.c | 16 +++++++++++++++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim index 4cf37b76c..76fd3fac1 100644 --- a/src/testdir/test_vim9_disassemble.vim +++ b/src/testdir/test_vim9_disassemble.vim @@ -2413,7 +2413,7 @@ def Test_disassemble_dict_stack() assert_match('\d*_UseMember\_s*' .. 'var d = {func: Legacy}\_s*' .. '\d PUSHS "func"\_s*' .. - '\d PUSHFUNC "Legacy"\_s*' .. + '\d PUSHFUNC "g:Legacy"\_s*' .. '\d NEWDICT size 1\_s*' .. '\d STORE $0\_s*' .. diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 9dc0d738d..f97f902f7 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -1232,11 +1232,23 @@ def Test_set_opfunc_to_global_function() g:result = getreg('"')->count(' ') return '' enddef + # global function works at script level &operatorfunc = g:CountSpaces new 'a b c d e'->setline(1) feedkeys("g@_", 'x') assert_equal(4, g:result) + + &operatorfunc = '' + g:result = 0 + # global function works in :def function + def Func() + &operatorfunc = g:CountSpaces + enddef + Func() + feedkeys("g@_", 'x') + assert_equal(4, g:result) + bwipe! END CheckScriptSuccess(lines) diff --git a/src/version.c b/src/version.c index d1b667a50..633ebf026 100644 --- a/src/version.c +++ b/src/version.c @@ -749,6 +749,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3826, /**/ 3825, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index a75219e0a..50dc75605 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1281,12 +1281,26 @@ generate_PUSHBLOB(cctx_T *cctx, blob_T *blob) generate_PUSHFUNC(cctx_T *cctx, char_u *name, type_T *type) { isn_T *isn; + char_u *funcname; RETURN_OK_IF_SKIP(cctx); if ((isn = generate_instr_type(cctx, ISN_PUSHFUNC, type)) == NULL) return FAIL; - isn->isn_arg.string = name == NULL ? NULL : vim_strsave(name); + if (name == NULL) + funcname = NULL; + else if (*name == K_SPECIAL) // script-local + funcname = vim_strsave(name); + else + { + funcname = alloc(STRLEN(name) + 3); + if (funcname != NULL) + { + STRCPY(funcname, "g:"); + STRCPY(funcname + 2, name); + } + } + isn->isn_arg.string = funcname; return OK; } -- cgit v1.2.1