0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

patch 9.0.2050: Vim9: crash with deferred function call and exception

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: #13376
closes: #13377

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
This commit is contained in:
Yegappan Lakshmanan
2023-10-19 10:52:34 +02:00
committed by Christian Brabandt
parent d7b616d0ad
commit c59c1e0d88
8 changed files with 106 additions and 50 deletions

View File

@@ -747,6 +747,43 @@ 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.
*/