# HG changeset patch # User Bram Moolenaar # Date 1596301203 -7200 # Node ID 5470c36ed7e6bf4e7255c8898fce8d8c0319f5d5 # Parent 31cfab8f9cedbe827264f1e85422df3fa96d675f patch 8.2.1343: Vim9: cannot find global function when using g: Commit: https://github.com/vim/vim/commit/333894b195479c9304a19f4e6ec1a9c09ecf07e4 Author: Bram Moolenaar Date: Sat Aug 1 18:53:07 2020 +0200 patch 8.2.1343: Vim9: cannot find global function when using g: Problem: Vim9: cannot find global function when using g: when local function with the same name exists. Solution: Find global function when using g:. diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -161,6 +161,21 @@ def Test_nested_global_function() CheckScriptSuccess(lines) enddef +def Test_global_local_function() + let lines =<< trim END + vim9script + def g:Func(): string + return 'global' + enddef + def Func(): string + return 'local' + enddef + assert_equal('global', g:Func()) + assert_equal('local', Func()) + END + CheckScriptSuccess(lines) +enddef + func TakesOneArg(arg) echo a:arg endfunc diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -789,9 +789,10 @@ find_func_even_dead(char_u *name, int is if (!is_global) { - char_u *after_script = NULL; - - if (in_vim9script()) + int vim9script = in_vim9script(); + char_u *after_script = NULL; + + if (vim9script) { // Find script-local function before global one. func = find_func_with_sid(name, current_sctx.sc_sid); @@ -799,7 +800,7 @@ find_func_even_dead(char_u *name, int is return func; } - if (!in_vim9script() + if (!vim9script && name[0] == K_SPECIAL && name[1] == KS_EXTRA && name[2] == KE_SNR) @@ -815,7 +816,7 @@ find_func_even_dead(char_u *name, int is else after_script = NULL; } - if (in_vim9script() || after_script != NULL) + if (vim9script || after_script != NULL) { // Find imported function before global one. imported = find_imported( @@ -2086,10 +2087,14 @@ call_func( if (error == FCERR_NONE && funcexe->evaluate) { char_u *rfname = fname; - - // Ignore "g:" before a function name. + int is_global = FALSE; + + // Skip "g:" before a function name. if (fp == NULL && fname[0] == 'g' && fname[1] == ':') + { + is_global = TRUE; rfname = fname + 2; + } rettv->v_type = VAR_NUMBER; // default rettv is number zero rettv->vval.v_number = 0; @@ -2101,7 +2106,7 @@ call_func( * User defined function. */ if (fp == NULL) - fp = find_func(rfname, FALSE, NULL); + fp = find_func(rfname, is_global, NULL); // Trigger FuncUndefined event, may load the function. if (fp == NULL @@ -2110,13 +2115,13 @@ call_func( && !aborting()) { // executed an autocommand, search for the function again - fp = find_func(rfname, FALSE, NULL); + fp = find_func(rfname, is_global, NULL); } // Try loading a package. if (fp == NULL && script_autoload(rfname, TRUE) && !aborting()) { // loaded a package, search for the function again - fp = find_func(rfname, FALSE, NULL); + fp = find_func(rfname, is_global, NULL); } if (fp == NULL) { @@ -2125,7 +2130,7 @@ call_func( // If using Vim9 script try not local to the script. // TODO: should not do this if the name started with "s:". if (p != NULL) - fp = find_func(p, FALSE, NULL); + fp = find_func(p, is_global, NULL); } if (fp != NULL && (fp->uf_flags & FC_DELETED)) @@ -2175,6 +2180,7 @@ call_func( */ error = call_internal_func(fname, argcount, argvars, rettv); } + /* * The function call (or "FuncUndefined" autocommand sequence) might * have been aborted by an error, an interrupt, or an explicitly thrown diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1343, +/**/ 1342, /**/ 1341,