kopia lustrzana https://github.com/micropython/micropython
Merge d872e6eb90
into 5114f2c1ea
commit
e4bd387619
|
@ -52,6 +52,28 @@ Functions
|
||||||
present in pre-built firmware (due to it affecting performance). The relevant
|
present in pre-built firmware (due to it affecting performance). The relevant
|
||||||
configuration option is *MICROPY_PY_SYS_SETTRACE*.
|
configuration option is *MICROPY_PY_SYS_SETTRACE*.
|
||||||
|
|
||||||
|
.. function:: _exc_traceback(exc)
|
||||||
|
|
||||||
|
Retrieves traceback information from an exception object, including
|
||||||
|
the filename, line number, and code block name for every code location
|
||||||
|
on the call stack when the exception was thrown.
|
||||||
|
|
||||||
|
.. admonition:: Difference to CPython
|
||||||
|
:class: attention
|
||||||
|
|
||||||
|
This function is a MicroPython extension intended to provide similar
|
||||||
|
functionality to the ``__traceback__`` attribute of exception
|
||||||
|
objects in CPython.
|
||||||
|
|
||||||
|
.. admonition:: Unstable
|
||||||
|
:class: attention
|
||||||
|
|
||||||
|
This function directly exposes the internal traceback data used by
|
||||||
|
MicroPython. Future versions might introduce incompatible changes to
|
||||||
|
the format.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Constants
|
Constants
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
|
23
py/modsys.c
23
py/modsys.c
|
@ -180,6 +180,26 @@ static mp_obj_t mp_sys_print_exception(size_t n_args, const mp_obj_t *args) {
|
||||||
}
|
}
|
||||||
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_sys_print_exception_obj, 1, 2, mp_sys_print_exception);
|
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_sys_print_exception_obj, 1, 2, mp_sys_print_exception);
|
||||||
|
|
||||||
|
#if MICROPY_PY_SYS_EXC_TRACEBACK
|
||||||
|
STATIC mp_obj_t mp_sys_exc_traceback(mp_obj_t exc) {
|
||||||
|
if (!mp_obj_is_exception_instance(exc)) {
|
||||||
|
mp_raise_TypeError(MP_ERROR_TEXT("not an exception"));
|
||||||
|
}
|
||||||
|
size_t n, *values;
|
||||||
|
mp_obj_exception_get_traceback(exc, &n, &values);
|
||||||
|
// Assumption: n is a multiple of 3.
|
||||||
|
mp_obj_t obj = mp_obj_new_list(n, NULL);
|
||||||
|
mp_obj_list_t *list = MP_OBJ_TO_PTR(obj);
|
||||||
|
for (size_t i = 0; i < list->len; i += 3) {
|
||||||
|
list->items[i + 0] = MP_OBJ_NEW_QSTR(values[i + 0]); // filename
|
||||||
|
list->items[i + 1] = MP_OBJ_NEW_SMALL_INT(values[i + 1]); // line
|
||||||
|
list->items[i + 2] = MP_OBJ_NEW_QSTR(values[i + 2]); // block
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_sys_exc_traceback_obj, mp_sys_exc_traceback);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if MICROPY_PY_SYS_EXC_INFO
|
#if MICROPY_PY_SYS_EXC_INFO
|
||||||
static mp_obj_t mp_sys_exc_info(void) {
|
static mp_obj_t mp_sys_exc_info(void) {
|
||||||
mp_obj_t cur_exc = MP_OBJ_FROM_PTR(MP_STATE_VM(cur_exception));
|
mp_obj_t cur_exc = MP_OBJ_FROM_PTR(MP_STATE_VM(cur_exception));
|
||||||
|
@ -334,6 +354,9 @@ static const mp_rom_map_elem_t mp_module_sys_globals_table[] = {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_print_exception), MP_ROM_PTR(&mp_sys_print_exception_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_print_exception), MP_ROM_PTR(&mp_sys_print_exception_obj) },
|
||||||
|
#if MICROPY_PY_SYS_EXC_TRACEBACK
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR__exc_traceback), MP_ROM_PTR(&mp_sys_exc_traceback_obj) },
|
||||||
|
#endif
|
||||||
#if MICROPY_PY_SYS_ATEXIT
|
#if MICROPY_PY_SYS_ATEXIT
|
||||||
{ MP_ROM_QSTR(MP_QSTR_atexit), MP_ROM_PTR(&mp_sys_atexit_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_atexit), MP_ROM_PTR(&mp_sys_atexit_obj) },
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1447,6 +1447,11 @@ typedef double mp_float_t;
|
||||||
#define MICROPY_PY_SYS_MODULES (1)
|
#define MICROPY_PY_SYS_MODULES (1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Whether to provide "sys._exc_traceback" function.
|
||||||
|
#ifndef MICROPY_PY_SYS_EXC_TRACEBACK
|
||||||
|
#define MICROPY_PY_SYS_EXC_TRACEBACK (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EXTRA_FEATURES)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Whether to provide "sys.exc_info" function
|
// Whether to provide "sys.exc_info" function
|
||||||
// Avoid enabling this, this function is Python2 heritage
|
// Avoid enabling this, this function is Python2 heritage
|
||||||
#ifndef MICROPY_PY_SYS_EXC_INFO
|
#ifndef MICROPY_PY_SYS_EXC_INFO
|
||||||
|
|
Ładowanie…
Reference in New Issue