diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-03-25 01:29:09 +0200 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-03-25 01:42:01 +0200 |
commit | 9512e9e817909ec5103a11264a8d98356a402ec2 (patch) | |
tree | 97185be7ef6a1f1aff7a39d742c6184c6c7d858d /py/objexcept.c | |
parent | 7f8b31345b6be789792b676a8975497648b19a5c (diff) |
objexcept: Add "args" exception attribute, as well as StopIteration.value.
Diffstat (limited to 'py/objexcept.c')
-rw-r--r-- | py/objexcept.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/py/objexcept.c b/py/objexcept.c index de9bf1694..102450d27 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -53,16 +53,31 @@ STATIC mp_obj_t mp_obj_exception_make_new(mp_obj_t type_in, uint n_args, uint n_ o->base.type = type; o->traceback = MP_OBJ_NULL; o->msg = NULL; + o->args.base.type = &tuple_type; o->args.len = n_args; memcpy(o->args.items, args, n_args * sizeof(mp_obj_t)); return o; } +STATIC void exception_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { + mp_obj_exception_t *self = self_in; + if (attr == MP_QSTR_args) { + dest[0] = &self->args; + } else if (self->base.type == &mp_type_StopIteration && attr == MP_QSTR_value) { + if (self->args.len == 0) { + dest[0] = mp_const_none; + } else { + dest[0] = self->args.items[0]; + } + } +} + const mp_obj_type_t mp_type_BaseException = { { &mp_type_type }, .name = MP_QSTR_BaseException, .print = mp_obj_exception_print, .make_new = mp_obj_exception_make_new, + .load_attr = exception_load_attr, }; #define MP_DEFINE_EXCEPTION_BASE(base_name) \ @@ -74,6 +89,7 @@ const mp_obj_type_t mp_type_ ## exc_name = { \ .name = MP_QSTR_ ## exc_name, \ .print = mp_obj_exception_print, \ .make_new = mp_obj_exception_make_new, \ + .load_attr = exception_load_attr, \ .bases_tuple = (mp_obj_t)&mp_type_ ## base_name ## _base_tuple, \ }; |