summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-05-12 13:20:40 +0100
committerDamien George <damien.p.george@gmail.com>2016-05-12 13:20:40 +0100
commitd45e5f8c357d13e66aeac644e2b5ead8c734025f (patch)
treec6d9ab833d5a9b528e1b3cb05c47a31b2331a4c2
parent47bf6ba61a2f332b44471badd1e50658ae7d264c (diff)
downloadmicropython-d45e5f8c357d13e66aeac644e2b5ead8c734025f.tar.gz
micropython-d45e5f8c357d13e66aeac644e2b5ead8c734025f.zip
py: Add mp_errno_to_str() and use it to provide nicer OSError msgs.
If an OSError is raised with an integer argument, and that integer corresponds to an errno, then the string for the errno is used as the argument to the exception, instead of the integer. Only works if the uerrno module is enabled.
-rw-r--r--py/moduerrno.c9
-rw-r--r--py/mperrno.h6
-rw-r--r--py/objexcept.c5
3 files changed, 20 insertions, 0 deletions
diff --git a/py/moduerrno.c b/py/moduerrno.c
index 826f52d2ea..0b543a1934 100644
--- a/py/moduerrno.c
+++ b/py/moduerrno.c
@@ -89,4 +89,13 @@ const mp_obj_module_t mp_module_uerrno = {
.globals = (mp_obj_dict_t*)&mp_module_uerrno_globals,
};
+mp_obj_t mp_errno_to_str(mp_obj_t errno_val) {
+ mp_map_elem_t *elem = mp_map_lookup((mp_map_t*)&errorcode_dict.map, errno_val, MP_MAP_LOOKUP);
+ if (elem == NULL) {
+ return errno_val;
+ } else {
+ return elem->value;
+ }
+}
+
#endif //MICROPY_PY_UERRNO
diff --git a/py/mperrno.h b/py/mperrno.h
index da541284c6..2dbb7b0a82 100644
--- a/py/mperrno.h
+++ b/py/mperrno.h
@@ -134,4 +134,10 @@
#endif
+#if MICROPY_PY_UERRNO
+mp_obj_t mp_errno_to_str(mp_obj_t errno_val);
+#else
+static inline mp_obj_t mp_errno_to_str(mp_obj_t errno_val) { return errno_val; }
+#endif
+
#endif // __MICROPY_INCLUDED_PY_MPERRNO_H__
diff --git a/py/objexcept.c b/py/objexcept.c
index adf17b08d0..4c1da1b387 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -36,6 +36,7 @@
#include "py/objtype.h"
#include "py/runtime.h"
#include "py/gc.h"
+#include "py/mperrno.h"
// Instance of MemoryError exception - needed by mp_malloc_fail
const mp_obj_exception_t mp_const_MemoryError_obj = {{&mp_type_MemoryError}, 0, 0, NULL, (mp_obj_tuple_t*)&mp_const_empty_tuple_obj};
@@ -288,6 +289,10 @@ mp_obj_t mp_obj_new_exception(const mp_obj_type_t *exc_type) {
// "Optimized" version for common(?) case of having 1 exception arg
mp_obj_t mp_obj_new_exception_arg1(const mp_obj_type_t *exc_type, mp_obj_t arg) {
+ // try to provide a nice string instead of numeric value for errno's
+ if (exc_type == &mp_type_OSError && MP_OBJ_IS_SMALL_INT(arg)) {
+ arg = mp_errno_to_str(arg);
+ }
return mp_obj_new_exception_args(exc_type, 1, &arg);
}