8000 Merge pull request #5562 from microDev1/traceback · jcbender/circuitpython@a69496b · GitHub
[go: up one dir, main page]

Skip to content

Commit a69496b

Browse files
authored
Merge pull request adafruit#5562 from microDev1/traceback
Refactor traceback handling
2 parents c6d7835 + 53a68f7 commit a69496b

File tree

5 files changed

+19
-23
lines changed

5 files changed

+19
-23
lines changed

ports/atmel-samd/boards/arduino_nano_33_iot/mpconfigboard.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ INTERNAL_FLASH_FILESYSTEM = 1
1010
LONGINT_IMPL = NONE
1111
CIRCUITPY_FULL_BUILD = 0
1212

13+
CIRCUITPY_ONEWIREIO = 0
1314
CIRCUITPY_RAINBOWIO = 0

py/mpstate.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,10 @@ typedef struct _mp_state_vm_t {
140140
#if MICROPY_KBD_EXCEPTION
141141
// exception object of type KeyboardInterrupt
142142
mp_obj_exception_t mp_kbd_exception;
143-
// traceback object to store traceback
144-
mp_obj_traceback_t mp_kbd_traceback;
145143
#endif
146144

147145
// exception object of type ReloadException
148146
mp_obj_exception_t mp_reload_exception;
149-
// traceback object to store traceback
150-
mp_obj_traceback_t mp_reload_traceback;
151147

152148
// dictionary with loaded modules (may be exposed as sys.modules)
153149
mp_obj_dict_t mp_loaded_modules_dict;

py/objexcept.c

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,7 @@ mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type, size_t n_args, siz
166166

167167
// Populate the exception object
168168
o_exc->base.type = type;
169-
170-
// Try to allocate memory for the traceback, with fallback to emergency traceback object
171-
o_exc->traceback = m_new_obj_maybe(mp_obj_traceback_t);
172-
if (o_exc->traceback == NULL) {
173-
o_exc->traceback = &MP_STATE_VM(mp_emergency_traceback_obj);
174-
}
175-
176-
// Populate the traceback object
177-
*o_exc->traceback = mp_const_empty_traceback_obj;
169+
o_exc->traceback = (mp_obj_traceback_t *)&mp_const_empty_traceback_obj;
178170

179171
mp_obj_tuple_t *o_tuple;
180172
if (n_args == 0) {
@@ -228,7 +220,7 @@ void mp_obj_exception_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
228220
// store/delete attribute
229221
if (attr == MP_QSTR___traceback__) {
230222
if (dest[1] == mp_const_none) {
231-
self->traceback->data = NULL;
223+
self->traceback = (mp_obj_traceback_t *)&mp_const_empty_traceback_obj;
232224
} else {
233225
if (!mp_obj_is_type(dest[1], &mp_type_traceback)) {
234226
mp_raise_TypeError(MP_ERROR_TEXT("invalid traceback"));
@@ -244,7 +236,7 @@ void mp_obj_exception_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
244236
} else if (attr == MP_QSTR_value && self->base.type == &mp_type_StopIteration) {
245237
dest[0] = mp_obj_exception_get_value(self_in);
246238
} else if (attr == MP_QSTR___traceback__) {
247-
dest[0] = (self->traceback->data) ? MP_OBJ_FROM_PTR(self->traceback) : mp_const_none;
239+
dest[0] = (self->traceback) ? MP_OBJ_FROM_PTR(self->traceback) : mp_const_none;
248240
#if MICROPY_CPYTHON_COMPAT
249241
} else if (mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(self->base.type), MP_OBJ_FROM_PTR(&mp_type_OSError))) {
250242
if (attr == MP_QSTR_errno) {
@@ -552,14 +544,23 @@ bool mp_obj_exception_match(mp_obj_t exc, mp_const_obj_t exc_type) {
552544

553545
void mp_obj_exception_clear_traceback(mp_obj_t self_in) {
554546
mp_obj_exception_t *self = get_native_exception(self_in);
555-
// just set the traceback to the null object
547+
// just set the traceback to the empty traceback object
556548
// we don't want to call any memory management functions here
557-
self->traceback->data = NULL;
549+
self->traceback = (mp_obj_traceback_t *)&mp_const_empty_traceback_obj;
558550
}
559551

560552
void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, size_t line, qstr block) {
561553
mp_obj_exception_t *self = get_native_exception(self_in);
562554

555+
// Try to allocate memory for the traceback, with fallback to emergency traceback object
556+
557+
if (self->traceback == NULL || self->traceback == (mp_obj_traceback_t *)&mp_const_empty_traceback_obj) {
558+
self->traceback = m_new_obj_maybe(mp_obj_traceback_t);
559+
if (self->traceback == NULL) {
560+
self->traceback = &MP_STATE_VM(mp_emergency_traceback_obj);
561+
}
562+
}
563+
563564
// append this traceback info to traceback data
564565
// if memory allocation fails (eg because gc is locked), just return
565566

@@ -613,7 +614,7 @@ void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, size_t line, qs
613614
void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values) {
614615
mp_obj_exception_t *self = get_native_exception(self_in);
615616

616-
if (self->traceback->data == NULL) {
617+
if (self->traceback == NULL) {
617618
*n = 0;
618619
*values = NULL;
619620
} else {

py/runtime.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,12 @@ void mp_init(void) {
8080
// initialise the exception object for raising KeyboardInterrupt
8181
MP_STATE_VM(mp_kbd_exception).base.type = &mp_type_KeyboardInterrupt;
8282
MP_STATE_VM(mp_kbd_exception).args = (mp_obj_tuple_t *)&mp_const_empty_tuple_obj;
83-
MP_STATE_VM(mp_kbd_exception).traceback = &MP_STATE_VM(mp_kbd_traceback);
84-
*MP_STATE_VM(mp_kbd_exception).traceback = mp_const_empty_traceback_obj;
83+
MP_STATE_VM(mp_kbd_exception).traceback = (mp_obj_traceback_t *)&mp_const_empty_traceback_obj;
8584
#endif
8685

8786
MP_STATE_VM(mp_reload_exception).base.type = &mp_type_ReloadException;
8887
MP_STATE_VM(mp_reload_exception).args = (mp_obj_tuple_t *)&mp_const_empty_tuple_obj;
89-
MP_STATE_VM(mp_reload_exception).traceback = &MP_STATE_VM(mp_reload_traceback);
90-
*MP_STATE_VM(mp_reload_exception).traceback = mp_const_empty_traceback_obj;
88+
MP_STATE_VM(mp_rel 96FE oad_exception).traceback = (mp_obj_traceback_t *)&mp_const_empty_traceback_obj;
9189

9290
// call port specific initialization if any
9391
#ifdef MICROPY_PORT_INIT_FUNC

py/scheduler.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void MICROPY_WRAP_MP_SCHED_EXCEPTION(mp_sched_exception)(mp_obj_t exc) {
4242
#if MICROPY_KBD_EXCEPTION
4343
// This function may be called asynchronously at any time so only do the bare minimum.
4444
void MICROPY_WRAP_MP_SCHED_KEYBOARD_INTERRUPT(mp_sched_keyboard_interrupt)(void) {
45-
MP_STATE_VM(mp_kbd_exception).traceback->data = NULL;
45+
MP_STATE_VM(mp_kbd_exception).traceback = (mp_obj_traceback_t *)&mp_const_empty_traceback_obj;
4646
mp_sched_exception(MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)));
4747
}
4848
#endif

0 commit comments

Comments
 (0)
0