vim-patch:9.0.2050: Vim9: crash with deferred function call and exception (#25715)

Problem:  Vim9: crash with deferred function call and exception
Solution: Save and restore exception state

Crash when a deferred function is called after an exception and another
exception is thrown

closes: vim/vim#13376
closes: vim/vim#13377

c59c1e0d88

The change in check_due_timer() is N/A as Nvim calls timer callbacks on
the main loop.

Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
This commit is contained in:
zeertzjq
2023-10-19 18:34:48 +08:00
committed by GitHub
parent ae7020c667
commit a096165977
4 changed files with 62 additions and 18 deletions

View File

@@ -661,6 +661,35 @@ static void finish_exception(except_T *excp)
discard_exception(excp, true);
}
/// Save the current exception state in "estate"
void exception_state_save(exception_state_T *estate)
{
estate->estate_current_exception = current_exception;
estate->estate_did_throw = did_throw;
estate->estate_need_rethrow = need_rethrow;
estate->estate_trylevel = trylevel;
}
/// Restore the current exception state from "estate"
void exception_state_restore(exception_state_T *estate)
{
if (current_exception == NULL) {
current_exception = estate->estate_current_exception;
}
did_throw |= estate->estate_did_throw;
need_rethrow |= estate->estate_need_rethrow;
trylevel |= estate->estate_trylevel;
}
/// Clear the current exception state
void exception_state_clear(void)
{
current_exception = NULL;
did_throw = false;
need_rethrow = false;
trylevel = 0;
}
// Flags specifying the message displayed by report_pending.
#define RP_MAKE 0
#define RP_RESUME 1