summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/include/numpy/ufuncobject.h5
-rw-r--r--numpy/core/src/multiarray/compiled_base.c2
-rw-r--r--numpy/core/src/multiarray/methods.c14
-rw-r--r--numpy/core/src/umath/ufunc_object.c70
4 files changed, 3 insertions, 88 deletions
diff --git a/numpy/core/include/numpy/ufuncobject.h b/numpy/core/include/numpy/ufuncobject.h
index 3f184bd45..1d7050bbe 100644
--- a/numpy/core/include/numpy/ufuncobject.h
+++ b/numpy/core/include/numpy/ufuncobject.h
@@ -173,11 +173,8 @@ typedef struct _tagPyUFuncObject {
* but this was never implemented. (This is also why the above
* selector is called the "legacy" selector.)
*/
- #if PY_VERSION_HEX >= 0x03080000
vectorcallfunc vectorcall;
- #else
- void *reserved2;
- #endif
+
/* Was previously the `PyUFunc_MaskedInnerLoopSelectionFunc` */
void *_always_null_previously_masked_innerloop_selector;
diff --git a/numpy/core/src/multiarray/compiled_base.c b/numpy/core/src/multiarray/compiled_base.c
index 9910fffe6..5853e068b 100644
--- a/numpy/core/src/multiarray/compiled_base.c
+++ b/numpy/core/src/multiarray/compiled_base.c
@@ -1393,7 +1393,7 @@ arr_add_docstring(PyObject *NPY_UNUSED(dummy), PyObject *args)
{
PyObject *obj;
PyObject *str;
- #if PY_VERSION_HEX >= 0x030700A2 && (!defined(PYPY_VERSION_NUM) || PYPY_VERSION_NUM > 0x07030300)
+ #if !defined(PYPY_VERSION_NUM) || PYPY_VERSION_NUM > 0x07030300
const char *docstr;
#else
char *docstr;
diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c
index 2d66c77dc..8e2cd09eb 100644
--- a/numpy/core/src/multiarray/methods.c
+++ b/numpy/core/src/multiarray/methods.c
@@ -1821,22 +1821,8 @@ array_reduce_ex_picklebuffer(PyArrayObject *self, int protocol)
descr = PyArray_DESCR(self);
- /* if the python version is below 3.8, the pickle module does not provide
- * built-in support for protocol 5. We try importing the pickle5
- * backport instead */
-#if PY_VERSION_HEX >= 0x03080000
/* we expect protocol 5 to be available in Python 3.8 */
pickle_module = PyImport_ImportModule("pickle");
-#else
- pickle_module = PyImport_ImportModule("pickle5");
- if (pickle_module == NULL) {
- /* for protocol 5, raise a clear ImportError if pickle5 is not found
- */
- PyErr_SetString(PyExc_ImportError, "Using pickle protocol 5 "
- "requires the pickle5 module for Python >=3.6 and <3.8");
- return NULL;
- }
-#endif
if (pickle_module == NULL){
return NULL;
}
diff --git a/numpy/core/src/umath/ufunc_object.c b/numpy/core/src/umath/ufunc_object.c
index 237af81b2..186f18a62 100644
--- a/numpy/core/src/umath/ufunc_object.c
+++ b/numpy/core/src/umath/ufunc_object.c
@@ -4926,65 +4926,6 @@ fail:
/*
- * TODO: The implementation below can be replaced with PyVectorcall_Call
- * when available (should be Python 3.8+).
- */
-static PyObject *
-ufunc_generic_call(
- PyUFuncObject *ufunc, PyObject *args, PyObject *kwds)
-{
- Py_ssize_t len_args = PyTuple_GET_SIZE(args);
- /*
- * Wrapper for tp_call to tp_fastcall, to support both on older versions
- * of Python. (and generally simplifying support of both versions in the
- * same codebase.
- */
- if (kwds == NULL) {
- return ufunc_generic_fastcall(ufunc,
- PySequence_Fast_ITEMS(args), len_args, NULL, NPY_FALSE);
- }
-
- PyObject *new_args[NPY_MAXARGS];
- Py_ssize_t len_kwds = PyDict_Size(kwds);
-
- if (NPY_UNLIKELY(len_args + len_kwds > NPY_MAXARGS)) {
- /*
- * We do not have enough scratch-space, so we have to abort;
- * In practice this error should not be seen by users.
- */
- PyErr_Format(PyExc_ValueError,
- "%s() takes from %d to %d positional arguments but "
- "%zd were given",
- ufunc_get_name_cstr(ufunc) , ufunc->nin, ufunc->nargs, len_args);
- return NULL;
- }
-
- /* Copy args into the scratch space */
- for (Py_ssize_t i = 0; i < len_args; i++) {
- new_args[i] = PyTuple_GET_ITEM(args, i);
- }
-
- PyObject *kwnames = PyTuple_New(len_kwds);
-
- PyObject *key, *value;
- Py_ssize_t pos = 0;
- Py_ssize_t i = 0;
- while (PyDict_Next(kwds, &pos, &key, &value)) {
- Py_INCREF(key);
- PyTuple_SET_ITEM(kwnames, i, key);
- new_args[i + len_args] = value;
- i++;
- }
-
- PyObject *res = ufunc_generic_fastcall(ufunc,
- new_args, len_args, kwnames, NPY_FALSE);
- Py_DECREF(kwnames);
- return res;
-}
-
-
-#if PY_VERSION_HEX >= 0x03080000
-/*
* Implement vectorcallfunc which should be defined with Python 3.8+.
* In principle this could be backported, but the speed gain seems moderate
* since ufunc calls often do not have keyword arguments and always have
@@ -5001,7 +4942,6 @@ ufunc_generic_vectorcall(PyObject *ufunc,
return ufunc_generic_fastcall((PyUFuncObject *)ufunc,
args, PyVectorcall_NARGS(len_args), kwnames, NPY_FALSE);
}
-#endif /* PY_VERSION_HEX >= 0x03080000 */
NPY_NO_EXPORT PyObject *
@@ -5178,11 +5118,7 @@ PyUFunc_FromFuncAndDataAndSignatureAndIdentity(PyUFuncGenericFunction *func, voi
ufunc->core_dim_flags = NULL;
ufunc->userloops = NULL;
ufunc->ptr = NULL;
-#if PY_VERSION_HEX >= 0x03080000
ufunc->vectorcall = &ufunc_generic_vectorcall;
-#else
- ufunc->reserved2 = NULL;
-#endif
ufunc->reserved1 = 0;
ufunc->iter_flags = 0;
@@ -6437,19 +6373,15 @@ NPY_NO_EXPORT PyTypeObject PyUFunc_Type = {
.tp_basicsize = sizeof(PyUFuncObject),
.tp_dealloc = (destructor)ufunc_dealloc,
.tp_repr = (reprfunc)ufunc_repr,
- .tp_call = (ternaryfunc)ufunc_generic_call,
+ .tp_call = &PyVectorcall_Call,
.tp_str = (reprfunc)ufunc_repr,
.tp_flags = Py_TPFLAGS_DEFAULT |
-#if PY_VERSION_HEX >= 0x03080000
_Py_TPFLAGS_HAVE_VECTORCALL |
-#endif
Py_TPFLAGS_HAVE_GC,
.tp_traverse = (traverseproc)ufunc_traverse,
.tp_methods = ufunc_methods,
.tp_getset = ufunc_getset,
-#if PY_VERSION_HEX >= 0x03080000
.tp_vectorcall_offset = offsetof(PyUFuncObject, vectorcall),
-#endif
};
/* End of code for ufunc objects */