0
0
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:
Bram Moolenaar 2020-08-12 16:38:10 +02:00
parent 7c5ad34878
commit ed677f5587
3 changed files with 29 additions and 4 deletions

View File

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

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 */
/**/
1428,
/**/ /**/
1427, 1427,
/**/ /**/

View File

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