Skip to content

Commit

Permalink
py: mp_call_function_*_protected(): Pass-thru return value if possible.
Browse files Browse the repository at this point in the history
Return the result of called function. If exception happened, return
MP_OBJ_NULL. Allows to use mp_call_function_*_protected() with callbacks
returning values, etc.
  • Loading branch information
pfalcon committed Dec 4, 2017
1 parent 3ff7040 commit 62b9614
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 6 deletions.
5 changes: 3 additions & 2 deletions py/runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,9 @@ mp_obj_t mp_call_method_n_kw(size_t n_args, size_t n_kw, const mp_obj_t *args);
mp_obj_t mp_call_method_n_kw_var(bool have_self, size_t n_args_n_kw, const mp_obj_t *args);
mp_obj_t mp_call_method_self_n_kw(mp_obj_t meth, mp_obj_t self, size_t n_args, size_t n_kw, const mp_obj_t *args);
// Call function and catch/dump exception - for Python callbacks from C code
void mp_call_function_1_protected(mp_obj_t fun, mp_obj_t arg);
void mp_call_function_2_protected(mp_obj_t fun, mp_obj_t arg1, mp_obj_t arg2);
// (return MP_OBJ_NULL in case of exception).
mp_obj_t mp_call_function_1_protected(mp_obj_t fun, mp_obj_t arg);
mp_obj_t mp_call_function_2_protected(mp_obj_t fun, mp_obj_t arg1, mp_obj_t arg2);

typedef struct _mp_call_args_t {
mp_obj_t fun;
Expand Down
12 changes: 8 additions & 4 deletions py/runtime_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,26 @@

#include "py/runtime.h"

void mp_call_function_1_protected(mp_obj_t fun, mp_obj_t arg) {
mp_obj_t mp_call_function_1_protected(mp_obj_t fun, mp_obj_t arg) {
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
mp_call_function_1(fun, arg);
mp_obj_t ret = mp_call_function_1(fun, arg);
nlr_pop();
return ret;
} else {
mp_obj_print_exception(&mp_plat_print, MP_OBJ_FROM_PTR(nlr.ret_val));
return MP_OBJ_NULL;
}
}

void mp_call_function_2_protected(mp_obj_t fun, mp_obj_t arg1, mp_obj_t arg2) {
mp_obj_t mp_call_function_2_protected(mp_obj_t fun, mp_obj_t arg1, mp_obj_t arg2) {
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
mp_call_function_2(fun, arg1, arg2);
mp_obj_t ret = mp_call_function_2(fun, arg1, arg2);
nlr_pop();
return ret;
} else {
mp_obj_print_exception(&mp_plat_print, MP_OBJ_FROM_PTR(nlr.ret_val));
return MP_OBJ_NULL;
}
}

0 comments on commit 62b9614

Please sign in to comment.