diff --git a/py/runtime.c b/py/runtime.c index c3ada7229..b4d5250e8 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -197,6 +197,11 @@ void mp_globals_locals_set_from_nlr_jump_callback(void *ctx_in) { mp_locals_set(ctx->locals); } +void mp_call_function_1_from_nlr_jump_callback(void *ctx_in) { + nlr_jump_callback_node_call_function_1_t *ctx = ctx_in; + ctx->func(ctx->arg); +} + mp_obj_t MICROPY_WRAP_MP_LOAD_NAME(mp_load_name)(qstr qst) { // logic: search locals, globals, builtins DEBUG_OP_printf("load name %s\n", qstr_str(qst)); diff --git a/py/runtime.h b/py/runtime.h index c033c77b4..5fa072d7e 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -29,6 +29,13 @@ #include "py/mpstate.h" #include "py/pystack.h" +// For use with mp_call_function_1_from_nlr_jump_callback. +#define MP_DEFINE_NLR_JUMP_CALLBACK_FUNCTION_1(ctx, f, a) \ + nlr_jump_callback_node_call_function_1_t ctx = { \ + .func = (void (*)(void *))(f), \ + .arg = (a), \ + } + typedef enum { MP_VM_RETURN_NORMAL, MP_VM_RETURN_YIELD, @@ -73,6 +80,13 @@ typedef struct _nlr_jump_callback_node_globals_locals_t { mp_obj_dict_t *locals; } nlr_jump_callback_node_globals_locals_t; +// For use with mp_call_function_1_from_nlr_jump_callback. +typedef struct _nlr_jump_callback_node_call_function_1_t { + nlr_jump_callback_node_t callback; + void (*func)(void *); + void *arg; +} nlr_jump_callback_node_call_function_1_t; + // Tables mapping operator enums to qstrs, defined in objtype.c extern const byte mp_unary_op_method_name[]; extern const byte mp_binary_op_method_name[]; @@ -121,6 +135,7 @@ static inline void mp_globals_set(mp_obj_dict_t *d) { } void mp_globals_locals_set_from_nlr_jump_callback(void *ctx_in); +void mp_call_function_1_from_nlr_jump_callback(void *ctx_in); mp_obj_t mp_load_name(qstr qst); mp_obj_t mp_load_global(qstr qst);