8000 py/modsys.c: Add sys._exc_traceback. · micropython/micropython@e7a799e · GitHub
[go: up one dir, main page]

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)
0