diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2016-01-01 22:05:30 +0200 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2016-01-01 22:06:38 +0200 |
commit | 467504da01880bbe926f49ab777785dcee61d9a8 (patch) | |
tree | 886c2bce2e9b378a6e2fa669d6cb1225e571c156 | |
parent | 30b7344eb0a96c9cf608bec55ea38dfcb39ddfaf (diff) | |
download | micropython-467504da01880bbe926f49ab777785dcee61d9a8.tar.gz micropython-467504da01880bbe926f49ab777785dcee61d9a8.zip |
extmod/moduos_dupterm: Handle exceptions in call to dupterm's .write()
-rw-r--r-- | extmod/moduos_dupterm.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/extmod/moduos_dupterm.c b/extmod/moduos_dupterm.c index 7fe8524a56..99022df37a 100644 --- a/extmod/moduos_dupterm.c +++ b/extmod/moduos_dupterm.c @@ -36,10 +36,21 @@ void mp_uos_dupterm_tx_strn(const char *str, size_t len) { if (MP_STATE_PORT(term_obj) != MP_OBJ_NULL) { - mp_obj_t write_m[3]; - mp_load_method(MP_STATE_PORT(term_obj), MP_QSTR_write, write_m); - write_m[2] = mp_obj_new_bytearray_by_ref(len, (char*)str); - mp_call_method_n_kw(1, 0, write_m); + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) { + mp_obj_t write_m[3]; + mp_load_method(MP_STATE_PORT(term_obj), MP_QSTR_write, write_m); + write_m[2] = mp_obj_new_bytearray_by_ref(len, (char*)str); + mp_call_method_n_kw(1, 0, write_m); + nlr_pop(); + } else { + // Temporarily disable dupterm to avoid infinite recursion + mp_obj_t save_term = MP_STATE_PORT(term_obj); + MP_STATE_PORT(term_obj) = NULL; + mp_printf(&mp_plat_print, "dupterm: "); + mp_obj_print_exception(&mp_plat_print, nlr.ret_val); + MP_STATE_PORT(term_obj) = save_term; + } } } |