py/nlr: Implement jump callbacks.
NLR buffers are usually quite large (use lots of C stack) and expensive to push and pop. Some of the time they are only needed to perform clean up if an exception happens, and then they re-raise the exception. This commit allows optimizing that scenario by introducing a linked-list of NLR callbacks that are called automatically when an exception is raised. They are essentially a light-weight NLR handler that can implement a "finally" block, i.e. clean-up when an exception is raised, or (by passing `true` to nlr_pop_jump_callback) when execution leaves the scope. Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
@@ -271,6 +271,7 @@ typedef struct _mp_state_thread_t {
|
||||
mp_obj_dict_t *dict_globals;
|
||||
|
||||
nlr_buf_t *nlr_top;
|
||||
nlr_jump_callback_node_t *nlr_jump_callback_top;
|
||||
|
||||
// pending exception object (MP_OBJ_NULL if not pending)
|
||||
volatile mp_obj_t mp_pending_exception;
|
||||
|
||||
Reference in New Issue
Block a user