py: mp_call_function_*_protected(): Pass-thru return value if possible.

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.
This commit is contained in:
Paul Sokolovsky
2017-12-05 00:38:41 +02:00
parent 3ff7040c8a
commit 62b96147e6
2 changed files with 11 additions and 6 deletions

View File

@@ -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;
}
}