summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Goldbaum <nathan.goldbaum@gmail.com>2023-04-19 12:10:55 -0600
committerNathan Goldbaum <nathan.goldbaum@gmail.com>2023-04-19 12:10:55 -0600
commit4fef2c36c24ebcea54ec9776c139ed0b0b68f04b (patch)
tree4fc005f3210059815ee6d4e9f5862db65858a94a
parent4403c01fc2a60bf7d08a356c0c37e3a98a3df26a (diff)
downloadnumpy-4fef2c36c24ebcea54ec9776c139ed0b0b68f04b.tar.gz
MAINT: housecleaning for traversal loop setup and implementations
-rw-r--r--numpy/core/src/multiarray/convert_datatype.c18
-rw-r--r--numpy/core/src/multiarray/ctors.c4
-rw-r--r--numpy/core/src/multiarray/dtype_traversal.c73
-rw-r--r--numpy/core/src/multiarray/dtype_traversal.h18
-rw-r--r--numpy/core/src/multiarray/dtypemeta.c72
5 files changed, 96 insertions, 89 deletions
diff --git a/numpy/core/src/multiarray/convert_datatype.c b/numpy/core/src/multiarray/convert_datatype.c
index 53db5c577..de1cd075d 100644
--- a/numpy/core/src/multiarray/convert_datatype.c
+++ b/numpy/core/src/multiarray/convert_datatype.c
@@ -3913,21 +3913,6 @@ PyArray_InitializeObjectToObjectCast(void)
}
-static int
-PyArray_SetClearFunctions(void)
-{
- PyArray_DTypeMeta *Object = PyArray_DTypeFromTypeNum(NPY_OBJECT);
- NPY_DT_SLOTS(Object)->get_clear_loop = &npy_get_clear_object_strided_loop;
- Py_DECREF(Object); /* use borrowed */
-
- PyArray_DTypeMeta *Void = PyArray_DTypeFromTypeNum(NPY_VOID);
- NPY_DT_SLOTS(Void)->get_clear_loop = &npy_get_clear_void_and_legacy_user_dtype_loop;
- Py_DECREF(Void); /* use borrowed */
- return 0;
-}
-
-
-
NPY_NO_EXPORT int
PyArray_InitializeCasts()
{
@@ -3947,8 +3932,5 @@ PyArray_InitializeCasts()
if (PyArray_InitializeDatetimeCasts() < 0) {
return -1;
}
- if (PyArray_SetClearFunctions() < 0) {
- return -1;
- }
return 0;
}
diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors.c
index f2ccc2325..79a1905a7 100644
--- a/numpy/core/src/multiarray/ctors.c
+++ b/numpy/core/src/multiarray/ctors.c
@@ -949,11 +949,11 @@ PyArray_NewFromDescr_int(
}
}
}
- NPY_traverse_info_xfree(fill_zero_info);
+ NPY_traverse_info_xfree(&fill_zero_info);
return (PyObject *)fa;
fail:
- NPY_traverse_info_xfree(fill_zero_info);
+ NPY_traverse_info_xfree(&fill_zero_info);
Py_XDECREF(fa->mem_handler);
Py_DECREF(fa);
return NULL;
diff --git a/numpy/core/src/multiarray/dtype_traversal.c b/numpy/core/src/multiarray/dtype_traversal.c
index cefa7d6e1..39b30ad3b 100644
--- a/numpy/core/src/multiarray/dtype_traversal.c
+++ b/numpy/core/src/multiarray/dtype_traversal.c
@@ -24,7 +24,7 @@
#include "alloc.h"
#include "array_method.h"
#include "dtypemeta.h"
-
+#include "refcount.h"
#include "dtype_traversal.h"
@@ -124,6 +124,38 @@ npy_get_clear_object_strided_loop(
}
+/**************** Python Object zero fill *********************/
+
+static int
+fill_zero_object_strided_loop(
+ void *NPY_UNUSED(traverse_context), PyArray_Descr *NPY_UNUSED(descr),
+ char *data, npy_intp size, npy_intp stride,
+ NpyAuxData *NPY_UNUSED(auxdata))
+{
+ PyObject *zero = PyLong_FromLong(0);
+ while (size--) {
+ Py_INCREF(zero);
+ memcpy(data, &zero, sizeof(zero));
+ data += stride;
+ }
+ Py_DECREF(zero);
+ return 0;
+}
+
+NPY_NO_EXPORT int
+npy_object_get_fill_zero_loop(void *NPY_UNUSED(traverse_context),
+ PyArray_Descr *NPY_UNUSED(descr),
+ int NPY_UNUSED(aligned),
+ npy_intp NPY_UNUSED(fixed_stride),
+ traverse_loop_function **out_loop,
+ NpyAuxData **NPY_UNUSED(out_auxdata),
+ NPY_ARRAYMETHOD_FLAGS *flags)
+{
+ *flags = NPY_METH_REQUIRES_PYAPI | NPY_METH_NO_FLOATINGPOINT_ERRORS;
+ *out_loop = &fill_zero_object_strided_loop;
+ return 0;
+}
+
/**************** Structured DType clear funcationality ***************/
/*
@@ -408,7 +440,6 @@ clear_no_op(
return 0;
}
-
NPY_NO_EXPORT int
npy_get_clear_void_and_legacy_user_dtype_loop(
void *traverse_context, PyArray_Descr *dtype, int aligned,
@@ -472,3 +503,41 @@ npy_get_clear_void_and_legacy_user_dtype_loop(
dtype);
return -1;
}
+
+/**************** Structured DType zero fill ***************/
+
+static int
+fill_zero_void_with_objects_strided_loop(
+ void *NPY_UNUSED(traverse_context), PyArray_Descr *descr,
+ char *data, npy_intp size, npy_intp stride,
+ NpyAuxData *NPY_UNUSED(auxdata))
+{
+ PyObject *zero = PyLong_FromLong(0);
+ while (size--) {
+ _fillobject(data, zero, descr);
+ data += stride;
+ }
+ Py_DECREF(zero);
+ return 0;
+}
+
+
+NPY_NO_EXPORT int
+npy_void_get_fill_zero_loop(void *NPY_UNUSED(traverse_context),
+ PyArray_Descr *descr,
+ int NPY_UNUSED(aligned),
+ npy_intp NPY_UNUSED(fixed_stride),
+ traverse_loop_function **out_loop,
+ NpyAuxData **NPY_UNUSED(out_auxdata),
+ NPY_ARRAYMETHOD_FLAGS *flags)
+{
+ *flags = NPY_METH_NO_FLOATINGPOINT_ERRORS;
+ if (PyDataType_REFCHK(descr)) {
+ *flags |= NPY_METH_REQUIRES_PYAPI;
+ *out_loop = &fill_zero_void_with_objects_strided_loop;
+ }
+ else {
+ *out_loop = NULL;
+ }
+ return 0;
+}
diff --git a/numpy/core/src/multiarray/dtype_traversal.h b/numpy/core/src/multiarray/dtype_traversal.h
index f5eaa0c27..a9c185382 100644
--- a/numpy/core/src/multiarray/dtype_traversal.h
+++ b/numpy/core/src/multiarray/dtype_traversal.h
@@ -19,6 +19,22 @@ npy_get_clear_void_and_legacy_user_dtype_loop(
traverse_loop_function **out_loop, NpyAuxData **out_traversedata,
NPY_ARRAYMETHOD_FLAGS *flags);
+/* NumPy DType zero-filling implementations */
+
+NPY_NO_EXPORT int
+npy_object_get_fill_zero_loop(
+ void *NPY_UNUSED(traverse_context), PyArray_Descr *NPY_UNUSED(descr),
+ int NPY_UNUSED(aligned), npy_intp NPY_UNUSED(fixed_stride),
+ traverse_loop_function **out_loop, NpyAuxData **NPY_UNUSED(out_auxdata),
+ NPY_ARRAYMETHOD_FLAGS *flags);
+
+NPY_NO_EXPORT int
+npy_void_get_fill_zero_loop(
+ void *NPY_UNUSED(traverse_context), PyArray_Descr *descr,
+ int NPY_UNUSED(aligned), npy_intp NPY_UNUSED(fixed_stride),
+ traverse_loop_function **out_loop, NpyAuxData **NPY_UNUSED(out_auxdata),
+ NPY_ARRAYMETHOD_FLAGS *flags);
+
/* Helper to deal with calling or nesting simple strided loops */
@@ -80,4 +96,4 @@ PyArray_GetClearFunction(
NPY_traverse_info *clear_info, NPY_ARRAYMETHOD_FLAGS *flags);
-#endif /* NUMPY_CORE_SRC_MULTIARRAY_DTYPE_TRAVERSAL_H_ */ \ No newline at end of file
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_DTYPE_TRAVERSAL_H_ */
diff --git a/numpy/core/src/multiarray/dtypemeta.c b/numpy/core/src/multiarray/dtypemeta.c
index eb38ec7e3..f8c1b6617 100644
--- a/numpy/core/src/multiarray/dtypemeta.c
+++ b/numpy/core/src/multiarray/dtypemeta.c
@@ -21,6 +21,7 @@
#include "conversion_utils.h"
#include "templ_common.h"
#include "refcount.h"
+#include "dtype_traversal.h"
#include <assert.h>
@@ -525,41 +526,6 @@ void_common_instance(PyArray_Descr *descr1, PyArray_Descr *descr2)
return NULL;
}
-static int
-fill_zero_void_with_objects_strided_loop(
- void *NPY_UNUSED(traverse_context), PyArray_Descr *descr,
- char *data, npy_intp size, npy_intp stride,
- NpyAuxData *NPY_UNUSED(auxdata))
-{
- PyObject *zero = PyLong_FromLong(0);
- while (size--) {
- _fillobject(data, zero, descr);
- data += stride;
- }
- Py_DECREF(zero);
- return 0;
-}
-
-
-static int
-void_get_fill_zero_loop(void *NPY_UNUSED(traverse_context),
- PyArray_Descr *descr,
- int NPY_UNUSED(aligned),
- npy_intp NPY_UNUSED(fixed_stride),
- traverse_loop_function **out_loop,
- NpyAuxData **NPY_UNUSED(out_auxdata),
- NPY_ARRAYMETHOD_FLAGS *flags)
-{
- *flags = NPY_METH_NO_FLOATINGPOINT_ERRORS;
- if (PyDataType_REFCHK(descr)) {
- *flags |= NPY_METH_REQUIRES_PYAPI;
- *out_loop = &fill_zero_void_with_objects_strided_loop;
- }
- else {
- *out_loop = NULL;
- }
- return 0;
-}
NPY_NO_EXPORT int
python_builtins_are_known_scalar_types(
@@ -735,35 +701,6 @@ object_common_dtype(
return cls;
}
-static int
-fill_zero_object_strided_loop(
- void *NPY_UNUSED(traverse_context), PyArray_Descr *NPY_UNUSED(descr),
- char *data, npy_intp size, npy_intp stride,
- NpyAuxData *NPY_UNUSED(auxdata))
-{
- PyObject *zero = PyLong_FromLong(0);
- while (size--) {
- Py_INCREF(zero);
- memcpy(data, &zero, sizeof(zero));
- }
- Py_DECREF(zero);
- return 0;
-}
-
-
-static int
-object_get_fill_zero_loop(void *NPY_UNUSED(traverse_context),
- PyArray_Descr *NPY_UNUSED(descr),
- int NPY_UNUSED(aligned),
- npy_intp NPY_UNUSED(fixed_stride),
- traverse_loop_function **out_loop,
- NpyAuxData **NPY_UNUSED(out_auxdata),
- NPY_ARRAYMETHOD_FLAGS *flags)
-{
- *flags = NPY_METH_REQUIRES_PYAPI|NPY_METH_NO_FLOATINGPOINT_ERRORS;
- *out_loop = &fill_zero_object_strided_loop;
- return 0;
-}
/**
* This function takes a PyArray_Descr and replaces its base class with
@@ -933,7 +870,8 @@ dtypemeta_wrap_legacy_descriptor(PyArray_Descr *descr)
}
else if (descr->type_num == NPY_OBJECT) {
dt_slots->common_dtype = object_common_dtype;
- dt_slots->get_fill_zero_loop = object_get_fill_zero_loop;
+ dt_slots->get_fill_zero_loop = npy_object_get_fill_zero_loop;
+ dt_slots->get_clear_loop = npy_get_clear_object_strided_loop;
}
else if (PyTypeNum_ISDATETIME(descr->type_num)) {
/* Datetimes are flexible, but were not considered previously */
@@ -955,7 +893,9 @@ dtypemeta_wrap_legacy_descriptor(PyArray_Descr *descr)
void_discover_descr_from_pyobject);
dt_slots->common_instance = void_common_instance;
dt_slots->ensure_canonical = void_ensure_canonical;
- dt_slots->get_fill_zero_loop = void_get_fill_zero_loop;
+ dt_slots->get_fill_zero_loop = npy_void_get_fill_zero_loop;
+ dt_slots->get_clear_loop =
+ npy_get_clear_void_and_legacy_user_dtype_loop;
}
else {
dt_slots->default_descr = string_and_unicode_default_descr;