summaryrefslogtreecommitdiffstatshomepage
path: root/py/objexcept.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-02-15 22:24:03 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-02-15 22:41:14 +0300
commitfa3b8951452ca13a807c0b6a090e0385507113db (patch)
tree84f4d280e5e696a91528327aae226adeb3f28bbd /py/objexcept.c
parent29c4f92e13f27a6fabf7556184325c2483ace358 (diff)
downloadmicropython-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.c12
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) {