mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.2.4446: Vim9: cannot refer to a global function like a local one
Problem: Vim9: cannot refer to a global function like a local one. Solution: When g:name is not a variable but a function, use a function reference. (closes #9826)
This commit is contained in:
parent
29a9e69718
commit
fe73255c92
@ -427,6 +427,21 @@ def Test_call_call()
|
||||
call('reverse', [l])
|
||||
l->assert_equal([1, 2, 3])
|
||||
|
||||
var lines =<< trim END
|
||||
vim9script
|
||||
def Outer()
|
||||
def g:Inner()
|
||||
g:done = 'Inner'
|
||||
enddef
|
||||
call(g:Inner, [])
|
||||
enddef
|
||||
Outer()
|
||||
assert_equal('Inner', g:done)
|
||||
unlet g:done
|
||||
END
|
||||
v9.CheckScriptSuccess(lines)
|
||||
delfunc g:Inner
|
||||
|
||||
v9.CheckDefExecAndScriptFailure(['call(123, [2])'], 'E1256: String or function required for argument 1')
|
||||
v9.CheckDefExecAndScriptFailure(['call(true, [2])'], 'E1256: String or function required for argument 1')
|
||||
v9.CheckDefAndScriptFailure(['call("reverse", 2)'], ['E1013: Argument 2: type mismatch, expected list<any> but got number', 'E1211: List required for argument 2'])
|
||||
|
@ -750,6 +750,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
4446,
|
||||
/**/
|
||||
4445,
|
||||
/**/
|
||||
|
@ -2333,13 +2333,30 @@ load_namespace_var(ectx_T *ectx, isntype_T isn_type, isn_T *iptr)
|
||||
|
||||
if (di == NULL)
|
||||
{
|
||||
if (isn_type == ISN_LOADG)
|
||||
{
|
||||
ufunc_T *ufunc = find_func(iptr->isn_arg.string, TRUE);
|
||||
|
||||
// g:Something could be a function
|
||||
if (ufunc != NULL)
|
||||
{
|
||||
typval_T *tv = STACK_TV_BOT(0);
|
||||
|
||||
++ectx->ec_stack.ga_len;
|
||||
tv->v_type = VAR_FUNC;
|
||||
tv->vval.v_string = alloc(STRLEN(iptr->isn_arg.string) + 3);
|
||||
if (tv->vval.v_string == NULL)
|
||||
return FAIL;
|
||||
STRCPY(tv->vval.v_string, "g:");
|
||||
STRCPY(tv->vval.v_string + 2, iptr->isn_arg.string);
|
||||
return OK;
|
||||
}
|
||||
}
|
||||
SOURCING_LNUM = iptr->isn_lnum;
|
||||
if (vim_strchr(iptr->isn_arg.string,
|
||||
AUTOLOAD_CHAR) != NULL)
|
||||
if (vim_strchr(iptr->isn_arg.string, AUTOLOAD_CHAR) != NULL)
|
||||
// no check if the item exists in the script but
|
||||
// isn't exported, it is too complicated
|
||||
semsg(_(e_item_not_found_in_script_str),
|
||||
iptr->isn_arg.string);
|
||||
semsg(_(e_item_not_found_in_script_str), iptr->isn_arg.string);
|
||||
else
|
||||
semsg(_(e_undefined_variable_char_str),
|
||||
namespace, iptr->isn_arg.string);
|
||||
|
Loading…
x
Reference in New Issue
Block a user