diff options
author | ZyX <kp-pav@yandex.ru> | 2018-01-21 03:27:48 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2018-03-25 14:50:48 +0300 |
commit | 79b4b6fc86497fcb7b3f986e98cbf03f93b5b082 (patch) | |
tree | 2fcdd5af2b8bf6b05ddab5eb87fcf344ddbda5a2 /src | |
parent | f8d2aef4f20887bb5a407b5a34cd5dc29fc6771c (diff) | |
download | rneovim-79b4b6fc86497fcb7b3f986e98cbf03f93b5b082.tar.gz rneovim-79b4b6fc86497fcb7b3f986e98cbf03f93b5b082.tar.bz2 rneovim-79b4b6fc86497fcb7b3f986e98cbf03f93b5b082.zip |
*: Make sure that !did_throw implies !current_exception
Fixes #7876
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/api/private/helpers.c | 3 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 33 | ||||
-rw-r--r-- | src/nvim/ex_eval.c | 7 | ||||
-rw-r--r-- | src/nvim/globals.h | 3 |
4 files changed, 28 insertions, 18 deletions
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index 1115faaeaf..29024a471f 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -47,6 +47,9 @@ typedef struct { /// @param[out] tstate Location where try state should be saved. void try_enter(TryState *const tstate) { + // TODO(ZyX-I): Check whether try_enter()/try_leave() may use + // enter_cleanup()/leave_cleanup(). Or + // save_dbg_stuff()/restore_dbg_stuff(). *tstate = (TryState) { .current_exception = current_exception, .msg_list = (const struct msglist *const *)msg_list, diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 99495aaa61..e96db33f00 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -403,13 +403,12 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline, /* * "did_throw" will be set to TRUE when an exception is being thrown. */ - did_throw = FALSE; - /* - * "did_emsg" will be set to TRUE when emsg() is used, in which case we - * cancel the whole command line, and any if/endif or loop. - * If force_abort is set, we cancel everything. - */ - did_emsg = FALSE; + did_throw = false; + current_exception = NULL; + // "did_emsg" will be set to TRUE when emsg() is used, in which case we + // cancel the whole command line, and any if/endif or loop. + // If force_abort is set, we cancel everything. + did_emsg = false; /* * KeyTyped is only set when calling vgetc(). Reset it here when not @@ -715,10 +714,11 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline, */ if (cstack.cs_lflags & CSL_HAD_FINA) { cstack.cs_lflags &= ~CSL_HAD_FINA; - report_make_pending(cstack.cs_pending[cstack.cs_idx] - & (CSTP_ERROR | CSTP_INTERRUPT | CSTP_THROW), - did_throw ? (void *)current_exception : NULL); - did_emsg = got_int = did_throw = FALSE; + report_make_pending((cstack.cs_pending[cstack.cs_idx] + & (CSTP_ERROR | CSTP_INTERRUPT | CSTP_THROW)), + (did_throw ? (void *)current_exception : NULL)); + did_emsg = got_int = did_throw = false; + current_exception = NULL; cstack.cs_flags[cstack.cs_idx] |= CSF_ACTIVE | CSF_FINALLY; } @@ -1782,13 +1782,14 @@ static char_u * do_one_cmd(char_u **cmdlinep, )); - /* forced commands */ + // Forced commands. if (*p == '!' && ea.cmdidx != CMD_substitute && ea.cmdidx != CMD_smagic && ea.cmdidx != CMD_snomagic) { - ++p; - ea.forceit = TRUE; - } else - ea.forceit = FALSE; + p++; + ea.forceit = true; + } else { + ea.forceit = false; + } /* * 6. Parse arguments. diff --git a/src/nvim/ex_eval.c b/src/nvim/ex_eval.c index 4010a088c8..ef287fe34d 100644 --- a/src/nvim/ex_eval.c +++ b/src/nvim/ex_eval.c @@ -1426,6 +1426,10 @@ void ex_catch(exarg_T *eap) if (cstack->cs_exception[cstack->cs_idx] != current_exception) { internal_error("ex_catch()"); } + // Discarding current_exceptions happens based on what is stored in + // cstack->cs_exception, *all* calls to discard_current_exception() are + // (and must be) guarded by did_throw which was already unset above. + current_exception = NULL; } else { /* * If there is a preceding catch clause and it caught the exception, @@ -1785,7 +1789,8 @@ void enter_cleanup(cleanup_T *csp) cause_abort = FALSE; } } - did_emsg = got_int = did_throw = need_rethrow = FALSE; + did_emsg = got_int = did_throw = need_rethrow = false; + current_exception = NULL; /* Report if required by the 'verbose' option or when debugging. */ report_make_pending(pending, csp->exception); diff --git a/src/nvim/globals.h b/src/nvim/globals.h index e857f5ff5b..c8b24b3488 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -325,7 +325,8 @@ EXTERN except_T *current_exception; * did_throw: An exception is being thrown. Reset when the exception is caught * or as long as it is pending in a finally clause. */ -EXTERN int did_throw INIT(= FALSE); +// FIXME: Replace did_throw checks with current_exception checks. +EXTERN int did_throw INIT(= false); /* * need_rethrow: set to TRUE when a throw that cannot be handled in do_cmdline() |