mirror of
https://github.com/neovim/neovim.git
synced 2025-09-19 01:38:16 +00:00
fix(exceptions): restore did_throw
(#20000)
`!did_throw` doesn't exactly imply `!current_exception`, as `did_throw = false` is sometimes used to defer exception handling for later (without forgetting the exception). E.g: uncaught exception handling in `do_cmdline()` may be deferred to a different call (e.g: when `try_level > 0`). In #7881, `current_exception = NULL` in `do_cmdline()` is used as an analogue of `did_throw = false`, but also causes the pending exception to be lost, which also leaks as `discard_exception()` wasn't used. It may be possible to fix this by saving/restoring `current_exception`, but handling all of `did_throw`'s edge cases seems messier. Maybe not worth diverging over. This fix also uncovers a `man_spec.lua` bug on Windows: exceptions are thrown due to Windows missing `man`, but they're lost; skip these tests if `man` isn't executable.
This commit is contained in:
@@ -137,7 +137,7 @@ Object nvim_eval(String expr, Error *err)
|
||||
if (!recursive) {
|
||||
force_abort = false;
|
||||
suppress_errthrow = false;
|
||||
current_exception = NULL;
|
||||
did_throw = false;
|
||||
// `did_emsg` is set by emsg(), which cancels execution.
|
||||
did_emsg = false;
|
||||
}
|
||||
@@ -196,7 +196,7 @@ static Object _call_function(String fn, Array args, dict_T *self, Error *err)
|
||||
if (!recursive) {
|
||||
force_abort = false;
|
||||
suppress_errthrow = false;
|
||||
current_exception = NULL;
|
||||
did_throw = false;
|
||||
// `did_emsg` is set by emsg(), which cancels execution.
|
||||
did_emsg = false;
|
||||
}
|
||||
|
Reference in New Issue
Block a user