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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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.
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user