From 070e099e653a8ac9a7683d1b0584fe6e575cd721 Mon Sep 17 00:00:00 2001 From: Starbuck5 Date: Wed, 25 Aug 2021 15:37:46 -0700 Subject: [PATCH 1/3] More informative FileNotFoundError --- src_c/rwobject.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src_c/rwobject.c b/src_c/rwobject.c index 6d7d179f41..87dfae95e5 100644 --- a/src_c/rwobject.c +++ b/src_c/rwobject.c @@ -46,6 +46,8 @@ typedef struct { static const char pg_default_encoding[] = "unicode_escape"; static const char pg_default_errors[] = "backslashreplace"; +static PyObject* os_module = NULL; + #define PATHLIB "pathlib" #define PUREPATH "PurePath" @@ -736,8 +738,47 @@ _rwops_from_pystr(PyObject *obj) #if PY3 if (PyUnicode_Check(obj)) { SDL_ClearError(); - PyErr_SetString(PyExc_FileNotFoundError, - "No such file or directory."); + + if (os_module) { + PyObject* cwd = PyObject_CallMethod(os_module, "getcwd", + NULL); + if (cwd == NULL) { + PyErr_SetString(PyExc_FileNotFoundError, + "No such file or directory."); + return NULL; + } + + PyObject* path = PyObject_GetAttrString(os_module, "path"); + if (path == NULL) { + Py_DECREF(cwd); + PyErr_SetString(PyExc_FileNotFoundError, + "No such file or directory."); + return NULL; + } + + PyObject* abs = PyObject_CallMethod(path, "isabs", "O", obj); + if (abs == NULL) { + Py_DECREF(cwd); + Py_DECREF(path); + PyErr_SetString(PyExc_FileNotFoundError, + "No such file or directory."); + return NULL; + } + + if (abs == Py_False) { + PyErr_Format(PyExc_FileNotFoundError, + "No file '%S' found in working directory" + " '%S'.", obj, cwd); + } + else { + PyErr_SetString(PyExc_FileNotFoundError, + "No such file or directory."); + } + } + else { + PyErr_SetString(PyExc_FileNotFoundError, + "No such file or directory."); + } #else if (PyUnicode_Check(obj) || PyString_Check(obj)) { SDL_ClearError(); @@ -861,5 +902,11 @@ MODINIT_DEFINE(rwobject) DECREF_MOD(module); MODINIT_ERROR; } + + /* import os, don't sweat if it errors, it will be checked before use */ + os_module = PyImport_ImportModule("os"); + if (os_module == NULL) + PyErr_Clear(); + MODINIT_RETURN(module); } From d2ae9085a6ab48a9861f1a12dbac25225a1ca40b Mon Sep 17 00:00:00 2001 From: Starbuck5 Date: Wed, 25 Aug 2021 17:35:03 -0700 Subject: [PATCH 2/3] FileNotFoundError: remember to decref --- src_c/rwobject.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src_c/rwobject.c b/src_c/rwobject.c index 87dfae95e5..2de3bccfc0 100644 --- a/src_c/rwobject.c +++ b/src_c/rwobject.c @@ -774,6 +774,9 @@ _rwops_from_pystr(PyObject *obj) PyErr_SetString(PyExc_FileNotFoundError, "No such file or directory."); } + Py_DECREF(cwd); + Py_DECREF(path); + Py_DECREF(abs); } else { PyErr_SetString(PyExc_FileNotFoundError, From fd02e309ca43597f8ea6c84d5c6db4535609eacd Mon Sep 17 00:00:00 2001 From: Starbuck5 Date: Sun, 19 Sep 2021 00:40:03 -0700 Subject: [PATCH 3/3] FileNotFoundError: Also add 'normal' functionality --- src_c/rwobject.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src_c/rwobject.c b/src_c/rwobject.c index 2de3bccfc0..35154efa72 100644 --- a/src_c/rwobject.c +++ b/src_c/rwobject.c @@ -756,8 +756,8 @@ _rwops_from_pystr(PyObject *obj) return NULL; } - PyObject* abs = PyObject_CallMethod(path, "isabs", "O", obj); - if (abs == NULL) { + PyObject* isabs = PyObject_CallMethod(path, "isabs", "O", obj); + if (isabs == NULL) { Py_DECREF(cwd); Py_DECREF(path); PyErr_SetString(PyExc_FileNotFoundError, @@ -765,22 +765,22 @@ _rwops_from_pystr(PyObject *obj) return NULL; } - if (abs == Py_False) { + if (isabs == Py_False) { PyErr_Format(PyExc_FileNotFoundError, "No file '%S' found in working directory" " '%S'.", obj, cwd); } else { - PyErr_SetString(PyExc_FileNotFoundError, - "No such file or directory."); + PyErr_Format(PyExc_FileNotFoundError, + "No such file or directory: '%S'.", obj); } Py_DECREF(cwd); Py_DECREF(path); - Py_DECREF(abs); + Py_DECREF(isabs); } else { - PyErr_SetString(PyExc_FileNotFoundError, - "No such file or directory."); + PyErr_Format(PyExc_FileNotFoundError, + "No such file or directory: '%S'.", obj); } #else if (PyUnicode_Check(obj) || PyString_Check(obj)) {