@@ -53,16 +53,31 @@ STATIC mp_obj_t mp_obj_exception_make_new(mp_obj_t type_in, uint n_args, uint n_
5353 o -> base .type = type ;
5454 o -> traceback = MP_OBJ_NULL ;
5555 o -> msg = NULL ;
56+ o -> args .base .type = & tuple_type ;
5657 o -> args .len = n_args ;
5758 memcpy (o -> args .items , args , n_args * sizeof (mp_obj_t ));
5859 return o ;
5960}
6061
62+ STATIC void exception_load_attr (mp_obj_t self_in , qstr attr , mp_obj_t * dest ) {
63+ mp_obj_exception_t * self = self_in ;
64+ if (attr == MP_QSTR_args ) {
65+ dest [0 ] = & self -> args ;
66+ } else if (self -> base .type == & mp_type_StopIteration && attr == MP_QSTR_value ) {
67+ if (self -> args .len == 0 ) {
68+ dest [0 ] = mp_const_none ;
69+ } else {
70+ dest [0 ] = self -> args .items [0 ];
71+ }
72+ }
73+ }
74+
6175const mp_obj_type_t mp_type_BaseException = {
6276 { & mp_type_type },
6377 .name = MP_QSTR_BaseException ,
6478 .print = mp_obj_exception_print ,
6579 .make_new = mp_obj_exception_make_new ,
80+ .load_attr = exception_load_attr ,
6681};
6782
6883#define MP_DEFINE_EXCEPTION_BASE (base_name ) \
@@ -74,6 +89,7 @@ const mp_obj_type_t mp_type_ ## exc_name = { \
7489 .name = MP_QSTR_ ## exc_name, \
7590 .print = mp_obj_exception_print, \
7691 .make_new = mp_obj_exception_make_new, \
92+ .load_attr = exception_load_attr, \
7793 .bases_tuple = (mp_obj_t)&mp_type_ ## base_name ## _base_tuple, \
7894};
7995
0 commit comments