mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.1534: Vim9: type error for argument type is not at call position
Problem: Vim9: type error for argument type is not at call position. Solution: Set the context and stack after checking the arguments. (issue #6785)
This commit is contained in:
@@ -223,6 +223,15 @@ def Test_call_wrong_args()
|
|||||||
call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
|
call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
|
||||||
call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
|
call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
|
||||||
call CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
|
call CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
def Func(s: string)
|
||||||
|
echo s
|
||||||
|
enddef
|
||||||
|
Func([])
|
||||||
|
END
|
||||||
|
call CheckScriptFailure(lines, 'E1012: type mismatch, expected string but got list<unknown>', 5)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
" Default arg and varargs
|
" Default arg and varargs
|
||||||
|
@@ -1314,17 +1314,10 @@ call_user_func(
|
|||||||
|
|
||||||
if (fp->uf_def_status != UF_NOT_COMPILED)
|
if (fp->uf_def_status != UF_NOT_COMPILED)
|
||||||
{
|
{
|
||||||
estack_push_ufunc(fp, 1);
|
|
||||||
save_current_sctx = current_sctx;
|
|
||||||
current_sctx = fp->uf_script_ctx;
|
|
||||||
|
|
||||||
// Execute the function, possibly compiling it first.
|
// Execute the function, possibly compiling it first.
|
||||||
call_def_function(fp, argcount, argvars, funcexe->partial, rettv);
|
call_def_function(fp, argcount, argvars, funcexe->partial, rettv);
|
||||||
--depth;
|
--depth;
|
||||||
current_funccal = fc->caller;
|
current_funccal = fc->caller;
|
||||||
|
|
||||||
estack_pop();
|
|
||||||
current_sctx = save_current_sctx;
|
|
||||||
free_funccal(fc);
|
free_funccal(fc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -754,6 +754,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 */
|
||||||
|
/**/
|
||||||
|
1534,
|
||||||
/**/
|
/**/
|
||||||
1533,
|
1533,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -726,7 +726,7 @@ call_def_function(
|
|||||||
int idx;
|
int idx;
|
||||||
int ret = FAIL;
|
int ret = FAIL;
|
||||||
int defcount = ufunc->uf_args.ga_len - argc;
|
int defcount = ufunc->uf_args.ga_len - argc;
|
||||||
int save_sc_version = current_sctx.sc_version;
|
sctx_T save_current_sctx = current_sctx;
|
||||||
int breakcheck_count = 0;
|
int breakcheck_count = 0;
|
||||||
int called_emsg_before = called_emsg;
|
int called_emsg_before = called_emsg;
|
||||||
|
|
||||||
@@ -867,7 +867,10 @@ call_def_function(
|
|||||||
ectx.ec_instr = dfunc->df_instr;
|
ectx.ec_instr = dfunc->df_instr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Following errors are in the function, not the caller.
|
||||||
// Commands behave like vim9script.
|
// Commands behave like vim9script.
|
||||||
|
estack_push_ufunc(ufunc, 1);
|
||||||
|
current_sctx = ufunc->uf_script_ctx;
|
||||||
current_sctx.sc_version = SCRIPT_VERSION_VIM9;
|
current_sctx.sc_version = SCRIPT_VERSION_VIM9;
|
||||||
|
|
||||||
// Decide where to start execution, handles optional arguments.
|
// Decide where to start execution, handles optional arguments.
|
||||||
@@ -2614,9 +2617,11 @@ failed:
|
|||||||
// When failed need to unwind the call stack.
|
// When failed need to unwind the call stack.
|
||||||
while (ectx.ec_frame_idx != initial_frame_idx)
|
while (ectx.ec_frame_idx != initial_frame_idx)
|
||||||
func_return(&ectx);
|
func_return(&ectx);
|
||||||
failed_early:
|
|
||||||
current_sctx.sc_version = save_sc_version;
|
|
||||||
|
|
||||||
|
estack_pop();
|
||||||
|
current_sctx = save_current_sctx;
|
||||||
|
|
||||||
|
failed_early:
|
||||||
// Free all local variables, but not arguments.
|
// Free all local variables, but not arguments.
|
||||||
for (idx = 0; idx < ectx.ec_stack.ga_len; ++idx)
|
for (idx = 0; idx < ectx.ec_stack.ga_len; ++idx)
|
||||||
clear_tv(STACK_TV(idx));
|
clear_tv(STACK_TV(idx));
|
||||||
|
Reference in New Issue
Block a user