Commit af1ae303 authored by Paul Sokolovsky's avatar Paul Sokolovsky
Browse files

objexcept: Add mp_obj_exception_get_value() convenience function.

This gets "value" of exceptions in the sense as it's defined for
StopIteration.value (i.e. args[0] or None).

TODO: This really should be inline function.
parent 38f0c607
...@@ -313,6 +313,7 @@ bool mp_obj_is_exception_instance(mp_obj_t self_in); ...@@ -313,6 +313,7 @@ bool mp_obj_is_exception_instance(mp_obj_t self_in);
void mp_obj_exception_clear_traceback(mp_obj_t self_in); void mp_obj_exception_clear_traceback(mp_obj_t self_in);
void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, machine_uint_t line, qstr block); void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, machine_uint_t line, qstr block);
void mp_obj_exception_get_traceback(mp_obj_t self_in, machine_uint_t *n, machine_uint_t **values); void mp_obj_exception_get_traceback(mp_obj_t self_in, machine_uint_t *n, machine_uint_t **values);
mp_obj_t mp_obj_exception_get_value(mp_obj_t self_in);
// str // str
extern const mp_obj_type_t str_type; extern const mp_obj_type_t str_type;
......
...@@ -59,16 +59,22 @@ STATIC mp_obj_t mp_obj_exception_make_new(mp_obj_t type_in, uint n_args, uint n_ ...@@ -59,16 +59,22 @@ STATIC mp_obj_t mp_obj_exception_make_new(mp_obj_t type_in, uint n_args, uint n_
return o; return o;
} }
// Get exception "value" - that is, first argument, or None
mp_obj_t mp_obj_exception_get_value(mp_obj_t self_in) {
mp_obj_exception_t *self = self_in;
if (self->args.len == 0) {
return mp_const_none;
} else {
return self->args.items[0];
}
}
STATIC void exception_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { STATIC void exception_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
mp_obj_exception_t *self = self_in; mp_obj_exception_t *self = self_in;
if (attr == MP_QSTR_args) { if (attr == MP_QSTR_args) {
dest[0] = &self->args; dest[0] = &self->args;
} else if (self->base.type == &mp_type_StopIteration && attr == MP_QSTR_value) { } else if (self->base.type == &mp_type_StopIteration && attr == MP_QSTR_value) {
if (self->args.len == 0) { dest[0] = mp_obj_exception_get_value(self);
dest[0] = mp_const_none;
} else {
dest[0] = self->args.items[0];
}
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment