Skip to content

Commit ccdb775

Browse files
committed
fix #2325: fix compilation on PyPy
1 parent 902fada commit ccdb775

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

HISTORY.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ XXXX-XX-XX
1010
- 2324_: enforce Ruff rule `raw-string-in-exception`, which helps providing
1111
clearer tracebacks when exceptions are raised by psutil.
1212

13+
**Bug fixes**
14+
15+
- 2325_, [PyPy]: psutil did not compile on PyPy due to missing
16+
`PyErr_SetExcFromWindowsErrWithFilenameObject` cPython API.
17+
1318
5.9.6
1419
=====
1520

psutil/_psutil_common.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,18 @@ PyErr_SetFromWindowsErrWithFilename(int winerr, const char *filename) {
5858
#endif // !defined(PyErr_SetFromWindowsErrWithFilename)
5959

6060

61+
#if !defined(PyErr_SetExcFromWindowsErrWithFilenameObject)
62+
PyObject *
63+
PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type,
64+
int ierr,
65+
PyObject *filename) {
66+
// Original function is too complex. Just raise OSError without
67+
// filename.
68+
return PyErr_SetFromWindowsErrWithFilename(ierr, NULL);
69+
}
70+
#endif // !defined(PyErr_SetExcFromWindowsErrWithFilenameObject)
71+
72+
6173
// PyPy 2.7
6274
#if !defined(PyErr_SetFromWindowsErr)
6375
PyObject *

psutil/_psutil_common.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,15 @@ static const int PSUTIL_CONN_NONE = 128;
3131
#define PyUnicode_DecodeFSDefaultAndSize PyString_FromStringAndSize
3232
#endif
3333

34-
#if defined(PSUTIL_WINDOWS) && \
35-
defined(PYPY_VERSION) && \
36-
!defined(PyErr_SetFromWindowsErrWithFilename)
37-
PyObject *PyErr_SetFromWindowsErrWithFilename(int ierr,
38-
const char *filename);
34+
#if defined(PSUTIL_WINDOWS) && defined(PYPY_VERSION)
35+
#if !defined(PyErr_SetFromWindowsErrWithFilename)
36+
PyObject *PyErr_SetFromWindowsErrWithFilename(int ierr,
37+
const char *filename);
38+
#endif
39+
#if !defined(PyErr_SetExcFromWindowsErrWithFilenameObject)
40+
PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
41+
PyObject *type, int ierr, PyObject *filename);
42+
#endif
3943
#endif
4044

4145
// --- _Py_PARSE_PID

0 commit comments

Comments
 (0)