0
0
mirror of https://github.com/vim/vim.git synced 2025-09-30 04:44:14 -04:00

patch 8.2.3793: using "g:Func" as a funcref does not work in script context

Problem:    Using "g:Func" as a funcref does not work in script context
            because "g:" is dropped.
Solution:   Keep "g:" in the name.  Also add parenthesis to avoid confusing
            operator prececence. (closes #9336)
This commit is contained in:
Bram Moolenaar
2021-12-12 21:02:03 +00:00
parent 04ef1fb13d
commit ef082e12df
3 changed files with 28 additions and 2 deletions

View File

@@ -1414,7 +1414,7 @@ ex_let_option(
n = (long)tv_get_number(tv); n = (long)tv_get_number(tv);
} }
if (opt_p_flags & P_FUNC && (tv->v_type == VAR_PARTIAL if ((opt_p_flags & P_FUNC) && (tv->v_type == VAR_PARTIAL
|| tv->v_type == VAR_FUNC)) || tv->v_type == VAR_FUNC))
{ {
// If the option can be set to a function reference or a lambda // If the option can be set to a function reference or a lambda
@@ -2723,7 +2723,12 @@ eval_variable(
if (rettv != NULL) if (rettv != NULL)
{ {
rettv->v_type = VAR_FUNC; rettv->v_type = VAR_FUNC;
rettv->vval.v_string = vim_strsave(ufunc->uf_name); if (STRNCMP(name, "g:", 2) == 0)
// Keep the "g:", otherwise script-local may be
// assumed.
rettv->vval.v_string = vim_strsave(name);
else
rettv->vval.v_string = vim_strsave(ufunc->uf_name);
if (rettv->vval.v_string != NULL) if (rettv->vval.v_string != NULL)
func_ref(ufunc->uf_name); func_ref(ufunc->uf_name);
} }

View File

@@ -1224,6 +1224,25 @@ def Test_set_opfunc_to_lambda()
CheckScriptSuccess(lines) CheckScriptSuccess(lines)
enddef enddef
def Test_set_opfunc_to_global_function()
var lines =<< trim END
vim9script
def g:CountSpaces(type = ''): string
normal! '[V']y
g:result = getreg('"')->count(' ')
return ''
enddef
&operatorfunc = g:CountSpaces
new
'a b c d e'->setline(1)
feedkeys("g@_", 'x')
assert_equal(4, g:result)
bwipe!
END
CheckScriptSuccess(lines)
&operatorfunc = ''
enddef
def Test_lambda_type_allocated() def Test_lambda_type_allocated()
# Check that unreferencing a partial using a lambda can use the variable type # Check that unreferencing a partial using a lambda can use the variable type
# after the lambda has been freed and does not leak memory. # after the lambda has been freed and does not leak memory.

View File

@@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3793,
/**/ /**/
3792, 3792,
/**/ /**/