diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-11-20 19:26:48 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-11-20 19:26:48 +0100 |
commit | eeece9e4885df6190d2615b199efa2b1d22c4bdb (patch) | |
tree | 20e918f60683f8e6ce9d8df715df4d3d28c921b9 /src | |
parent | bebaa0d5c034eb2c4c4dcac86ae6a859b24d2693 (diff) |
patch 8.2.2021: Vim9: get E1099 when autocommand resets did_emsgv8.2.2021
Problem: Vim9: get E1099 when autocommand resets did_emsg.
Solution: Add did_emsg_cumul. (closes #7336)
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_docmd.c | 11 | ||||
-rw-r--r-- | src/globals.h | 2 | ||||
-rw-r--r-- | src/testdir/test_vim9_func.vim | 14 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 17 |
5 files changed, 37 insertions, 9 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c index dbaf21847d..a6bdac3aba 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -747,6 +747,9 @@ do_cmdline( * cancel the whole command line, and any if/endif or loop. * If force_abort is set, we cancel everything. */ +#ifdef FEAT_EVAL + did_emsg_cumul += did_emsg; +#endif did_emsg = FALSE; /* @@ -778,7 +781,12 @@ do_cmdline( && !(getline_is_func && func_has_abort(real_cookie)) #endif ) + { +#ifdef FEAT_EVAL + did_emsg_cumul += did_emsg; +#endif did_emsg = FALSE; + } /* * 1. If repeating a line in a loop, get a line from lines_ga. @@ -1026,7 +1034,10 @@ do_cmdline( if (did_emsg && !force_abort && getline_equal(fgetline, cookie, get_func_line) && !func_has_abort(real_cookie)) + { + // did_emsg_cumul is not set here did_emsg = FALSE; + } if (cstack.cs_looplevel > 0) { diff --git a/src/globals.h b/src/globals.h index dd7fa4a531..af1a85c82a 100644 --- a/src/globals.h +++ b/src/globals.h @@ -230,6 +230,8 @@ EXTERN int did_endif INIT(= FALSE); // just had ":endif" EXTERN int did_emsg; // set by emsg() when the message // is displayed or thrown #ifdef FEAT_EVAL +EXTERN int did_emsg_cumul; // cumulative did_emsg, increased + // when did_emsg is reset. EXTERN int called_vim_beep; // set if vim_beep() is called EXTERN int did_uncaught_emsg; // emsg() was called and did not // cause an exception diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 5c937b6577..7b5d3e9d7e 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -1704,5 +1704,19 @@ def Test_block_scoped_var() CheckScriptSuccess(lines) enddef +def Test_reset_did_emsg() + var lines =<< trim END + @s = 'blah' + au BufWinLeave * # + def Func() + var winid = popup_create('popup', {}) + exe '*s' + popup_close(winid) + enddef + Func() + END + CheckScriptFailure(lines, 'E492:', 8) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index 4fdc0f1c85..aeadf361ad 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2021, +/**/ 2020, /**/ 2019, diff --git a/src/vim9execute.c b/src/vim9execute.c index a7d83b47a7..eca99f3aa2 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -833,7 +833,7 @@ call_def_function( int defcount = ufunc->uf_args.ga_len - argc; sctx_T save_current_sctx = current_sctx; int breakcheck_count = 0; - int did_emsg_before = did_emsg; + int did_emsg_before = did_emsg_cumul + did_emsg; int save_suppress_errthrow = suppress_errthrow; msglist_T **saved_msg_list = NULL; msglist_T *private_msg_list = NULL; @@ -859,7 +859,7 @@ call_def_function( || (ufunc->uf_def_status == UF_TO_BE_COMPILED && compile_def_function(ufunc, FALSE, NULL) == FAIL)) { - if (did_emsg == did_emsg_before) + if (did_emsg_cumul + did_emsg == did_emsg_before) semsg(_(e_function_is_not_compiled_str), printable_func_name(ufunc)); return FAIL; @@ -1086,13 +1086,10 @@ call_def_function( // execute Ex command line case ISN_EXEC: { - int save_did_emsg = did_emsg; - SOURCING_LNUM = iptr->isn_lnum; do_cmdline_cmd(iptr->isn_arg.string); - // do_cmdline_cmd() will reset did_emsg, but we want to - // keep track of the count to compare with did_emsg_before. - did_emsg += save_did_emsg; + if (did_emsg) + goto on_error; } break; @@ -1211,6 +1208,8 @@ call_def_function( { SOURCING_LNUM = iptr->isn_lnum; do_cmdline_cmd((char_u *)ga.ga_data); + if (did_emsg) + goto on_error; } else { @@ -2894,7 +2893,7 @@ func_return: on_error: // If "emsg_silent" is set then ignore the error. - if (did_emsg == did_emsg_before && emsg_silent) + if (did_emsg_cumul + did_emsg == did_emsg_before && emsg_silent) continue; // If we are not inside a try-catch started here, abort execution. @@ -2952,7 +2951,7 @@ failed_early: // Not sure if this is necessary. suppress_errthrow = save_suppress_errthrow; - if (ret != OK && did_emsg == did_emsg_before) + if (ret != OK && did_emsg_cumul + did_emsg == did_emsg_before) semsg(_(e_unknown_error_while_executing_str), printable_func_name(ufunc)); funcdepth_restore(orig_funcdepth); |