summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-09-05 18:12:26 +1000
committerDamien George <damien@micropython.org>2023-09-14 13:03:31 +1000
commitc9089e71a1b9202aa5abefbb3c9c29659ec838ab (patch)
tree3be343889997b955abb82189bf3064e99bc8da2d
parentdc99840b3a0e8afd97ab3b92ad2042233b000225 (diff)
py/runtime: Add helpers to call a general function on nlr jump callback.
Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--py/runtime.c5
-rw-r--r--py/runtime.h15
2 files changed, 20 insertions, 0 deletions
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);