diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2019-02-18 10:46:34 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-18 10:46:34 (GMT) |
commit | 09fbcd6085e18b534fd4161844ff39f77eb4a082 (patch) | |
tree | 18814d4cc2ac1949afac68a27474645973f835f5 /Modules/posixmodule.c | |
parent | ac28147e78c45a6217d348ce90ca5281d91f676f (diff) | |
download | cpython-09fbcd6085e18b534fd4161844ff39f77eb4a082.zip cpython-09fbcd6085e18b534fd4161844ff39f77eb4a082.tar.gz cpython-09fbcd6085e18b534fd4161844ff39f77eb4a082.tar.bz2 |
bpo-35942: Improve the error message if __fspath__ returns invalid types in path_converter (GH-11831)
The error message emitted when returning invalid types from __fspath__ in interfaces that allow passing PathLike objects has been improved and now it does explain the origin of the error.
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r-- | Modules/posixmodule.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 5995958..05afe9e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -954,28 +954,35 @@ path_converter(PyObject *o, void *p) if (!is_index && !is_buffer && !is_unicode && !is_bytes) { /* Inline PyOS_FSPath() for better error messages. */ _Py_IDENTIFIER(__fspath__); - PyObject *func = NULL; + PyObject *func, *res; func = _PyObject_LookupSpecial(o, &PyId___fspath__); if (NULL == func) { goto error_format; } - /* still owns a reference to the original object */ - Py_DECREF(o); - o = _PyObject_CallNoArg(func); + res = _PyObject_CallNoArg(func); Py_DECREF(func); - if (NULL == o) { + if (NULL == res) { goto error_exit; } - else if (PyUnicode_Check(o)) { + else if (PyUnicode_Check(res)) { is_unicode = 1; } - else if (PyBytes_Check(o)) { + else if (PyBytes_Check(res)) { is_bytes = 1; } else { - goto error_format; + PyErr_Format(PyExc_TypeError, + "expected %.200s.__fspath__() to return str or bytes, " + "not %.200s", Py_TYPE(o)->tp_name, + Py_TYPE(res)->tp_name); + Py_DECREF(res); + goto error_exit; } + + /* still owns a reference to the original object */ + Py_DECREF(o); + o = res; } if (is_unicode) { |