Skip to content

Commit e7a799e

Browse files
committed
py/modsys.c: Add sys._exc_traceback.
This makes it easier to provide custom formatting of exception stack traces, e.g. to make them fit on a tiny display. This is an experimental function that exposes internal details of MicroPython and it might change in the future. Signed-off-by: David (Pololu) <dev-david@pololu.com>
1 parent bde222c commit e7a799e

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

py/modsys.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,24 @@ STATIC mp_obj_t mp_sys_print_exception(size_t n_args, const mp_obj_t *args) {
150150
}
151151
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_sys_print_exception_obj, 1, 2, mp_sys_print_exception);
152152

153+
STATIC mp_obj_t mp_sys_exc_traceback(mp_obj_t exc) {
154+
if (!mp_obj_is_exception_instance(exc)) {
155+
mp_raise_TypeError(MP_ERROR_TEXT("not an exception"));
156+
}
157+
size_t n, *values;
158+
mp_obj_exception_get_traceback(exc, &n, &values);
159+
// Assumption: n is a multiple of 3.
160+
mp_obj_t obj = mp_obj_new_list(n, NULL);
161+
mp_obj_list_t *list = MP_OBJ_TO_PTR(obj);
162+
for (size_t i = 0; i < list->len; i += 3) {
163+
list->items[i + 0] = MP_OBJ_NEW_QSTR(values[i + 0]); // filename
164+
list->items[i + 1] = MP_OBJ_NEW_SMALL_INT(values[i + 1]); // line
165+
list->items[i + 2] = MP_OBJ_NEW_QSTR(values[i + 2]); // block
166+
}
167+
return obj;
168+
}
169+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_sys_exc_traceback_obj, mp_sys_exc_traceback);
170+
153171
#if MICROPY_PY_SYS_EXC_INFO
154172
STATIC mp_obj_t mp_sys_exc_info(void) {
155173
mp_obj_t cur_exc = MP_OBJ_FROM_PTR(MP_STATE_VM(cur_exception));
@@ -277,6 +295,7 @@ STATIC const mp_rom_map_elem_t mp_module_sys_globals_table[] = {
277295
*/
278296

279297
{ MP_ROM_QSTR(MP_QSTR_print_exception), MP_ROM_PTR(&mp_sys_print_exception_obj) },
298+
{ MP_ROM_QSTR(MP_QSTR__exc_traceback), MP_ROM_PTR(&mp_sys_exc_traceback_obj) },
280299
#if MICROPY_PY_SYS_ATEXIT
281300
{ MP_ROM_QSTR(MP_QSTR_atexit), MP_ROM_PTR(&mp_sys_atexit_obj) },
282301
#endif

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy