From 57b566e73614c74a9fc74cd2d2007d91cdb507db Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 4 Feb 2020 13:32:39 -0500 Subject: [PATCH 1/4] Include filename for 'No such file/directory', etc. --- extmod/vfs_fat_file.c | 2 +- py/runtime.c | 9 +++++++++ py/runtime.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/extmod/vfs_fat_file.c b/extmod/vfs_fat_file.c index 3ea9cee5295df..dc0a893a5ca34 100644 --- a/extmod/vfs_fat_file.c +++ b/extmod/vfs_fat_file.c @@ -199,7 +199,7 @@ STATIC mp_obj_t file_open(fs_user_mount_t *vfs, const mp_obj_type_t *type, mp_ar FRESULT res = f_open(&vfs->fatfs, &o->fp, fname, mode); if (res != FR_OK) { m_del_obj(pyb_file_obj_t, o); - mp_raise_OSError(fresult_to_errno_table[res]); + mp_raise_OSError_errno_str(fresult_to_errno_table[res], fname); } // If we're reading, turn on fast seek. if (mode == FA_READ) { diff --git a/py/runtime.c b/py/runtime.c index 48416bab2622b..cb174837c7c2a 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -29,10 +29,12 @@ #include #include + #include "extmod/vfs.h" #include "py/parsenum.h" #include "py/compile.h" +#include "py/mperrno.h" #include "py/objstr.h" #include "py/objtuple.h" #include "py/objtype.h" @@ -1576,6 +1578,13 @@ NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg) { mp_raise_msg(&mp_type_OSError, msg); } +NORETURN void mp_raise_OSError_errno_str(int errno_, const char *str) { + char decompressed[50]; + const char *errno_str = mp_common_errno_to_str(MP_OBJ_NEW_SMALL_INT(errno_), + decompressed, sizeof(decompressed)); + mp_raise_OSError_msg_varg(translate("[Errno %d] %s: %s"), errno_, errno_str, str); +} + NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...) { va_list argptr; va_start(argptr,fmt); diff --git a/py/runtime.h b/py/runtime.h index 4121352dfd0cc..319de5bb96905 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -161,6 +161,7 @@ NORETURN void mp_raise_RuntimeError(const compressed_string_t *msg); NORETURN void mp_raise_ImportError(const compressed_string_t *msg); NORETURN void mp_raise_IndexError(const compressed_string_t *msg); NORETURN void mp_raise_OSError(int errno_); +NORETURN void mp_raise_OSError_errno_str(int errno_, const char *str); NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg); NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...); NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg); From 5164719e67878418cff51d26f40e4813da02bc83 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 4 Feb 2020 16:19:40 -0500 Subject: [PATCH 2/4] preserve errno in OSError --- extmod/vfs_fat_file.c | 3 ++- py/objexcept.c | 7 +++++-- py/runtime.c | 11 ++++++----- py/runtime.h | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/extmod/vfs_fat_file.c b/extmod/vfs_fat_file.c index dc0a893a5ca34..422f057a855be 100644 --- a/extmod/vfs_fat_file.c +++ b/extmod/vfs_fat_file.c @@ -28,6 +28,7 @@ #if MICROPY_VFS && MICROPY_VFS_FAT #include +#include #include "py/runtime.h" #include "py/stream.h" @@ -199,7 +200,7 @@ STATIC mp_obj_t file_open(fs_user_mount_t *vfs, const mp_obj_type_t *type, mp_ar FRESULT res = f_open(&vfs->fatfs, &o->fp, fname, mode); if (res != FR_OK) { m_del_obj(pyb_file_obj_t, o); - mp_raise_OSError_errno_str(fresult_to_errno_table[res], fname); + mp_raise_OSError_errno_str(fresult_to_errno_table[res], args[0].u_obj); } // If we're reading, turn on fast seek. if (mode == FA_READ) { diff --git a/py/objexcept.c b/py/objexcept.c index c33ada0d698d5..8664060ec522d 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -112,14 +112,17 @@ void mp_obj_exception_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kin if (o->args == NULL || o->args->len == 0) { mp_print_str(print, ""); return; - } else if (o->args->len == 1) { - // try to provide a nice OSError error message + } else if (o->args->len <= 2) { + // try to provide a nice OSError error message; second arg might exist (e.g. filename). if (MP_OBJ_IS_SMALL_INT(o->args->items[0]) && mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(o->base.type), MP_OBJ_FROM_PTR(&mp_type_OSError))) { char decompressed[50]; const char *msg = mp_common_errno_to_str(o->args->items[0], decompressed, sizeof(decompressed)); if (msg != NULL) { mp_printf(print, "[Errno " INT_FMT "] %s", MP_OBJ_SMALL_INT_VALUE(o->args->items[0]), msg); + if (o->args->len == 2) { + mp_printf(print, ": '%s'", mp_obj_str_get_str(o->args->items[1])); + } return; } } diff --git a/py/runtime.c b/py/runtime.c index cb174837c7c2a..c1c311ae4c666 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -1578,11 +1578,12 @@ NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg) { mp_raise_msg(&mp_type_OSError, msg); } -NORETURN void mp_raise_OSError_errno_str(int errno_, const char *str) { - char decompressed[50]; - const char *errno_str = mp_common_errno_to_str(MP_OBJ_NEW_SMALL_INT(errno_), - decompressed, sizeof(decompressed)); - mp_raise_OSError_msg_varg(translate("[Errno %d] %s: %s"), errno_, errno_str, str); +NORETURN void mp_raise_OSError_errno_str(int errno_, mp_obj_t str) { + mp_obj_t args[2] = { + MP_OBJ_NEW_SMALL_INT(errno_), + str, + }; + nlr_raise(mp_obj_new_exception_args(&mp_type_OSError, 2, args)); } NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...) { diff --git a/py/runtime.h b/py/runtime.h index 319de5bb96905..f8110355712f1 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -161,7 +161,7 @@ NORETURN void mp_raise_RuntimeError(const compressed_string_t *msg); NORETURN void mp_raise_ImportError(const compressed_string_t *msg); NORETURN void mp_raise_IndexError(const compressed_string_t *msg); NORETURN void mp_raise_OSError(int errno_); -NORETURN void mp_raise_OSError_errno_str(int errno_, const char *str); +NORETURN void mp_raise_OSError_errno_str(int errno_, mp_obj_t str); NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg); NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...); NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg); From 7fe959ab39e14b000934b15d7cce13aae9f6a525 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 4 Feb 2020 16:41:25 -0500 Subject: [PATCH 3/4] fix multi-arg exception printing --- py/objexcept.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/py/objexcept.c b/py/objexcept.c index 8664060ec522d..f211b87ee0c85 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -112,20 +112,22 @@ void mp_obj_exception_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kin if (o->args == NULL || o->args->len == 0) { mp_print_str(print, ""); return; - } else if (o->args->len <= 2) { - // try to provide a nice OSError error message; second arg might exist (e.g. filename). - if (MP_OBJ_IS_SMALL_INT(o->args->items[0]) && - mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(o->base.type), MP_OBJ_FROM_PTR(&mp_type_OSError))) { - char decompressed[50]; - const char *msg = mp_common_errno_to_str(o->args->items[0], decompressed, sizeof(decompressed)); - if (msg != NULL) { - mp_printf(print, "[Errno " INT_FMT "] %s", MP_OBJ_SMALL_INT_VALUE(o->args->items[0]), msg); - if (o->args->len == 2) { - mp_printf(print, ": '%s'", mp_obj_str_get_str(o->args->items[1])); - } - return; + } + if (MP_OBJ_IS_SMALL_INT(o->args->items[0]) && + mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(o->base.type), MP_OBJ_FROM_PTR(&mp_type_OSError)) && + o->args->len <= 2) { + // try to provide a nice OSError error message + char decompressed[50]; + const char *msg = mp_common_errno_to_str(o->args->items[0], decompressed, sizeof(decompressed)); + if (msg != NULL) { + mp_printf(print, "[Errno " INT_FMT "] %s", MP_OBJ_SMALL_INT_VALUE(o->args->items[0]), msg); + // if second arg exists, it is filename. + if (o->args->len == 2) { + mp_printf(print, ": '%s'", mp_obj_str_get_str(o->args->items[1])); } + return; } + } else if (o->args->len == 1) { mp_obj_print_helper(print, o->args->items[0], PRINT_STR); return; } From e13642351c2827e62a614d569138de8971ebd7c8 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 4 Feb 2020 16:55:56 -0500 Subject: [PATCH 4/4] fix printing single-arg exceptions --- py/objexcept.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/py/objexcept.c b/py/objexcept.c index f211b87ee0c85..b7a536c5e355f 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -127,7 +127,8 @@ void mp_obj_exception_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kin } return; } - } else if (o->args->len == 1) { + } + if (o->args->len == 1) { mp_obj_print_helper(print, o->args->items[0], PRINT_STR); return; } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy