To: vim_dev@googlegroups.com Subject: Patch 8.2.1428 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1428 Problem: Vim9: :def function does not abort on nested function error. Solution: Check whether an error message was given. (closes #6691) Files: src/vim9execute.c, src/testdir/test_vim9_script.vim *** ../vim-8.2.1427/src/vim9execute.c 2020-08-12 15:21:18.966700480 +0200 --- src/vim9execute.c 2020-08-12 16:37:12.911618052 +0200 *************** *** 505,510 **** --- 505,511 ---- funcexe_T funcexe; int error; int idx; + int called_emsg_before = called_emsg; if (ufunc->uf_def_status == UF_TO_BE_COMPILED && compile_def_function(ufunc, FALSE, NULL) == FAIL) *************** *** 542,547 **** --- 543,551 ---- user_func_error(error, ufunc->uf_name); return FAIL; } + if (called_emsg > called_emsg_before) + // Error other than from calling the function itself. + return FAIL; return OK; } *************** *** 670,679 **** static int call_eval_func(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr) { ! int called_emsg_before = called_emsg; ! if (call_by_name(name, argcount, ectx, iptr) == FAIL ! && called_emsg == called_emsg_before) { dictitem_T *v; --- 674,684 ---- static int call_eval_func(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr) { ! int called_emsg_before = called_emsg; ! int res; ! res = call_by_name(name, argcount, ectx, iptr); ! if (res == FAIL && called_emsg == called_emsg_before) { dictitem_T *v; *************** *** 690,696 **** } return call_partial(&v->di_tv, argcount, ectx); } ! return OK; } /* --- 695,701 ---- } return call_partial(&v->di_tv, argcount, ectx); } ! return res; } /* *** ../vim-8.2.1427/src/testdir/test_vim9_script.vim 2020-08-09 14:43:53.752239834 +0200 --- src/testdir/test_vim9_script.vim 2020-08-12 16:36:18.500070420 +0200 *************** *** 1054,1059 **** --- 1054,1077 ---- CheckScriptSuccess(lines) 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() # only checks line continuation set errorformat=File\ %f\ line\ %l *** ../vim-8.2.1427/src/version.c 2020-08-12 15:48:51.662129295 +0200 --- src/version.c 2020-08-12 16:36:48.047822170 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1428, /**/ -- Rule #1: Don't give somebody a tool that he's going to hurt himself with. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///