diff options
author | Sebastian Berg <sebastian@sipsolutions.net> | 2020-09-21 08:39:57 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-21 08:39:57 -0500 |
commit | 64fb290a8cb8fa9201f18015f3de1186e950a137 (patch) | |
tree | a93a658da99ea2af3a243c1e4a37ce71d837873a | |
parent | e552726e3a5ff964a004d46558f534e7a47cab70 (diff) | |
parent | f983885f4cafddfe5b5c1e7e19e8d3a04d735fee (diff) | |
download | numpy-64fb290a8cb8fa9201f18015f3de1186e950a137.tar.gz |
Merge pull request #17356 from charris/enh-add-pylong_asint
ENH: Add Npy__PyLong_AsInt function.
-rw-r--r-- | numpy/core/include/numpy/npy_3kcompat.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/numpy/core/include/numpy/npy_3kcompat.h b/numpy/core/include/numpy/npy_3kcompat.h index 4bc06fc96..191cd244f 100644 --- a/numpy/core/include/numpy/npy_3kcompat.h +++ b/numpy/core/include/numpy/npy_3kcompat.h @@ -28,6 +28,30 @@ extern "C" { * PyInt -> PyLong */ + +/* + * This is a renamed copy of the Python non-limited API function _PyLong_AsInt. It is + * included here because it is missing from the PyPy API. It completes the PyLong_As* + * group of functions and can be useful in replacing PyInt_Check. + */ +static NPY_INLINE int +Npy__PyLong_AsInt(PyObject *obj) +{ + int overflow; + long result = PyLong_AsLongAndOverflow(obj, &overflow); + + /* INT_MAX and INT_MIN are defined in Python.h */ + if (overflow || result > INT_MAX || result < INT_MIN) { + /* XXX: could be cute and give a different + message for overflow == -1 */ + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert to C int"); + return -1; + } + return (int)result; +} + + #if defined(NPY_PY3K) /* Return True only if the long fits in a C long */ static NPY_INLINE int PyInt_Check(PyObject *op) { @@ -39,6 +63,7 @@ static NPY_INLINE int PyInt_Check(PyObject *op) { return (overflow == 0); } + #define PyInt_FromLong PyLong_FromLong #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AsLong |