0
0
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:
Bram Moolenaar
2020-08-28 17:19:07 +02:00
parent 6a950581da
commit ee8580e52e
4 changed files with 19 additions and 10 deletions

View File

@@ -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

View File

@@ -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;
} }

View File

@@ -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,
/**/ /**/

View File

@@ -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));