mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.2.1428: Vim9: :def function does not abort on nested function error
Problem: Vim9: :def function does not abort on nested function error. Solution: Check whether an error message was given. (closes #6691)
This commit is contained in:
parent
7c5ad34878
commit
ed677f5587
@ -1054,6 +1054,24 @@ def Test_throw_vimscript()
|
|||||||
CheckScriptSuccess(lines)
|
CheckScriptSuccess(lines)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def Test_error_in_nested_function()
|
||||||
|
# an error in a nested :function aborts executin in the calling :def function
|
||||||
|
let lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
def Func()
|
||||||
|
Error()
|
||||||
|
g:test_var = 1
|
||||||
|
enddef
|
||||||
|
func Error() abort
|
||||||
|
eval [][0]
|
||||||
|
endfunc
|
||||||
|
Func()
|
||||||
|
END
|
||||||
|
g:test_var = 0
|
||||||
|
CheckScriptFailure(lines, 'E684:')
|
||||||
|
assert_equal(0, g:test_var)
|
||||||
|
enddef
|
||||||
|
|
||||||
def Test_cexpr_vimscript()
|
def Test_cexpr_vimscript()
|
||||||
# only checks line continuation
|
# only checks line continuation
|
||||||
set errorformat=File\ %f\ line\ %l
|
set errorformat=File\ %f\ line\ %l
|
||||||
|
@ -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 */
|
||||||
|
/**/
|
||||||
|
1428,
|
||||||
/**/
|
/**/
|
||||||
1427,
|
1427,
|
||||||
/**/
|
/**/
|
||||||
|
@ -505,6 +505,7 @@ call_ufunc(ufunc_T *ufunc, int argcount, ectx_T *ectx, isn_T *iptr)
|
|||||||
funcexe_T funcexe;
|
funcexe_T funcexe;
|
||||||
int error;
|
int error;
|
||||||
int idx;
|
int idx;
|
||||||
|
int called_emsg_before = called_emsg;
|
||||||
|
|
||||||
if (ufunc->uf_def_status == UF_TO_BE_COMPILED
|
if (ufunc->uf_def_status == UF_TO_BE_COMPILED
|
||||||
&& compile_def_function(ufunc, FALSE, NULL) == FAIL)
|
&& compile_def_function(ufunc, FALSE, NULL) == FAIL)
|
||||||
@ -542,6 +543,9 @@ call_ufunc(ufunc_T *ufunc, int argcount, ectx_T *ectx, isn_T *iptr)
|
|||||||
user_func_error(error, ufunc->uf_name);
|
user_func_error(error, ufunc->uf_name);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
if (called_emsg > called_emsg_before)
|
||||||
|
// Error other than from calling the function itself.
|
||||||
|
return FAIL;
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -670,10 +674,11 @@ store_var(char_u *name, typval_T *tv)
|
|||||||
static int
|
static int
|
||||||
call_eval_func(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
|
call_eval_func(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
|
||||||
{
|
{
|
||||||
int called_emsg_before = called_emsg;
|
int called_emsg_before = called_emsg;
|
||||||
|
int res;
|
||||||
|
|
||||||
if (call_by_name(name, argcount, ectx, iptr) == FAIL
|
res = call_by_name(name, argcount, ectx, iptr);
|
||||||
&& called_emsg == called_emsg_before)
|
if (res == FAIL && called_emsg == called_emsg_before)
|
||||||
{
|
{
|
||||||
dictitem_T *v;
|
dictitem_T *v;
|
||||||
|
|
||||||
@ -690,7 +695,7 @@ call_eval_func(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
|
|||||||
}
|
}
|
||||||
return call_partial(&v->di_tv, argcount, ectx);
|
return call_partial(&v->di_tv, argcount, ectx);
|
||||||
}
|
}
|
||||||
return OK;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user