Skip to content

Commit

Permalink
MAINT: housecleaning for traversal loop setup and implementations
Browse files Browse the repository at this point in the history
  • Loading branch information
ngoldbaum committed Apr 19, 2023
1 parent 4403c01 commit 4fef2c3
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 89 deletions.
18 changes: 0 additions & 18 deletions numpy/core/src/multiarray/convert_datatype.c
Expand Up @@ -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()
{
Expand All @@ -3947,8 +3932,5 @@ PyArray_InitializeCasts()
if (PyArray_InitializeDatetimeCasts() < 0) {
return -1;
}
if (PyArray_SetClearFunctions() < 0) {
return -1;
}
return 0;
}
4 changes: 2 additions & 2 deletions numpy/core/src/multiarray/ctors.c
Expand Up @@ -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;
Expand Down
73 changes: 71 additions & 2 deletions numpy/core/src/multiarray/dtype_traversal.c
Expand Up @@ -24,7 +24,7 @@
#include "alloc.h"
#include "array_method.h"
#include "dtypemeta.h"

#include "refcount.h"
#include "dtype_traversal.h"


Expand Down Expand Up @@ -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 ***************/

/*
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}
18 changes: 17 additions & 1 deletion numpy/core/src/multiarray/dtype_traversal.h
Expand Up @@ -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 */

Expand Down Expand Up @@ -80,4 +96,4 @@ PyArray_GetClearFunction(
NPY_traverse_info *clear_info, NPY_ARRAYMETHOD_FLAGS *flags);


#endif /* NUMPY_CORE_SRC_MULTIARRAY_DTYPE_TRAVERSAL_H_ */
#endif /* NUMPY_CORE_SRC_MULTIARRAY_DTYPE_TRAVERSAL_H_ */
72 changes: 6 additions & 66 deletions numpy/core/src/multiarray/dtypemeta.c
Expand Up @@ -21,6 +21,7 @@
#include "conversion_utils.h"
#include "templ_common.h"
#include "refcount.h"
#include "dtype_traversal.h"

#include <assert.h>

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 */
Expand All @@ -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;
Expand Down

0 comments on commit 4fef2c3

Please sign in to comment.