Browse Source

objexcept: Add "args" exception attribute, as well as StopIteration.value.

pull/375/head
Paul Sokolovsky 11 years ago
parent
commit
9512e9e817
  1. 16
      py/objexcept.c
  2. 2
      py/qstrdefs.h
  3. 6
      tests/basics/exception1.py

16
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->base.type = type;
o->traceback = MP_OBJ_NULL; o->traceback = MP_OBJ_NULL;
o->msg = NULL; o->msg = NULL;
o->args.base.type = &tuple_type;
o->args.len = n_args; o->args.len = n_args;
memcpy(o->args.items, args, n_args * sizeof(mp_obj_t)); memcpy(o->args.items, args, n_args * sizeof(mp_obj_t));
return o; 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 = { const mp_obj_type_t mp_type_BaseException = {
{ &mp_type_type }, { &mp_type_type },
.name = MP_QSTR_BaseException, .name = MP_QSTR_BaseException,
.print = mp_obj_exception_print, .print = mp_obj_exception_print,
.make_new = mp_obj_exception_make_new, .make_new = mp_obj_exception_make_new,
.load_attr = exception_load_attr,
}; };
#define MP_DEFINE_EXCEPTION_BASE(base_name) \ #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, \ .name = MP_QSTR_ ## exc_name, \
.print = mp_obj_exception_print, \ .print = mp_obj_exception_print, \
.make_new = mp_obj_exception_make_new, \ .make_new = mp_obj_exception_make_new, \
.load_attr = exception_load_attr, \
.bases_tuple = (mp_obj_t)&mp_type_ ## base_name ## _base_tuple, \ .bases_tuple = (mp_obj_t)&mp_type_ ## base_name ## _base_tuple, \
}; };

2
py/qstrdefs.h

@ -78,6 +78,7 @@ Q(NoneType)
Q(abs) Q(abs)
Q(all) Q(all)
Q(any) Q(any)
Q(args)
Q(array) Q(array)
Q(bool) Q(bool)
Q(bytearray) Q(bytearray)
@ -123,6 +124,7 @@ Q(str)
Q(sys) Q(sys)
Q(tuple) Q(tuple)
Q(type) Q(type)
Q(value)
Q(zip) Q(zip)
Q(append) Q(append)

6
tests/basics/exception1.py

@ -7,3 +7,9 @@ print(str(IndexError("foo")))
a = IndexError(1, "test", [100, 200]) a = IndexError(1, "test", [100, 200])
print(repr(a)) print(repr(a))
print(str(a)) print(str(a))
print(a.args)
s = StopIteration()
print(s.value)
s = StopIteration(1, 2, 3)
print(s.value)

Loading…
Cancel
Save