diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2015-02-15 22:24:03 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2015-02-15 22:41:14 +0300 |
commit | fa3b8951452ca13a807c0b6a090e0385507113db (patch) | |
tree | 84f4d280e5e696a91528327aae226adeb3f28bbd /py/objexcept.c | |
parent | 29c4f92e13f27a6fabf7556184325c2483ace358 (diff) | |
download | micropython-fa3b8951452ca13a807c0b6a090e0385507113db.tar.gz micropython-fa3b8951452ca13a807c0b6a090e0385507113db.zip |
objexcept: Optimize traceback allocation for exception.
Traceback allocation for exception will now never lead to recursive
MemoryError exception - if there's no memory for traceback, it simply
won't be created.
Diffstat (limited to 'py/objexcept.c')
-rw-r--r-- | py/objexcept.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/py/objexcept.c b/py/objexcept.c index a8b81448ec..858804d0b7 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -436,11 +436,15 @@ void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, mp_uint_t line, // for traceback, we are just using the list object for convenience, it's not really a list of Python objects if (self->traceback == MP_OBJ_NULL) { - self->traceback = mp_obj_new_list(0, NULL); + self->traceback = mp_obj_new_list_maybe(3); + if (self->traceback == MP_OBJ_NULL) { + return; + } } - mp_obj_list_append(self->traceback, (mp_obj_t)(mp_uint_t)file); - mp_obj_list_append(self->traceback, (mp_obj_t)(mp_uint_t)line); - mp_obj_list_append(self->traceback, (mp_obj_t)(mp_uint_t)block); + mp_obj_list_t *list = self->traceback; + list->items[0] = (mp_obj_t)(mp_uint_t)file; + list->items[1] = (mp_obj_t)(mp_uint_t)line; + list->items[2] = (mp_obj_t)(mp_uint_t)block; } void mp_obj_exception_get_traceback(mp_obj_t self_in, mp_uint_t *n, mp_uint_t **values) { |