Skip to content

Commit 08214d1

Browse files
committed
Update stringdtype for NumPy 2.0
1 parent 1f2c42e commit 08214d1

File tree

10 files changed

+348
-434
lines changed

10 files changed

+348
-434
lines changed

stringdtype/stringdtype/src/casts.c

+86-72
Large diffs are not rendered by default.

stringdtype/stringdtype/src/casts.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
#define NPY_NO_DEPRECATED_API NPY_2_0_API_VERSION
1010
#define NPY_TARGET_VERSION NPY_2_0_API_VERSION
1111
#define NO_IMPORT_ARRAY
12-
#include "numpy/experimental_dtype_api.h"
12+
#include "numpy/ndarraytypes.h"
13+
#include "numpy/dtype_api.h"
1314

1415
PyArrayMethod_Spec **
1516
get_casts();

stringdtype/stringdtype/src/dtype.c

+44-32
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
#include <Python.h>
2+
#define PY_ARRAY_UNIQUE_SYMBOL stringdtype_ARRAY_API
3+
#define NPY_NO_DEPRECATED_API NPY_2_0_API_VERSION
4+
#define NPY_TARGET_VERSION NPY_2_0_API_VERSION
5+
#define NO_IMPORT_ARRAY
6+
#include "numpy/ndarraytypes.h"
7+
#include "numpy/arrayobject.h"
8+
#include "numpy/ufuncobject.h"
9+
#include "numpy/dtype_api.h"
10+
#include "numpy/halffloat.h"
11+
#include "numpy/npy_math.h"
12+
113
#include "dtype.h"
214

315
#include "casts.h"
@@ -24,7 +36,7 @@ new_stringdtype_instance(PyObject *na_object, int coerce)
2436
char *default_string_buf = NULL;
2537
char *na_name_buf = NULL;
2638

27-
allocator = NpyString_new_allocator(PyMem_RawMalloc, PyMem_RawFree,
39+
allocator = _NpyString_new_allocator(PyMem_RawMalloc, PyMem_RawFree,
2840
PyMem_RawRealloc);
2941
if (allocator == NULL) {
3042
PyErr_SetString(PyExc_MemoryError,
@@ -38,8 +50,8 @@ new_stringdtype_instance(PyObject *na_object, int coerce)
3850
goto fail;
3951
}
4052

41-
npy_static_string default_string = {0, NULL};
42-
npy_static_string na_name = {0, NULL};
53+
_npy_static_string default_string = {0, NULL};
54+
_npy_static_string na_name = {0, NULL};
4355

4456
Py_XINCREF(na_object);
4557
((StringDTypeObject *)new)->na_object = na_object;
@@ -127,7 +139,7 @@ new_stringdtype_instance(PyObject *na_object, int coerce)
127139
PyMem_RawFree(na_name_buf);
128140
}
129141
if (allocator != NULL) {
130-
NpyString_free_allocator(allocator);
142+
_NpyString_free_allocator(allocator);
131143
}
132144
if (allocator_lock != NULL) {
133145
PyThread_free_lock(allocator_lock);
@@ -262,15 +274,15 @@ stringdtype_setitem(StringDTypeObject *descr, PyObject *obj, char **dataptr)
262274
{
263275
npy_packed_static_string *sdata = (npy_packed_static_string *)dataptr;
264276

265-
npy_string_allocator *allocator = NpyString_acquire_allocator(descr);
277+
npy_string_allocator *allocator = _NpyString_acquire_allocator(descr);
266278

267279
// borrow reference
268280
PyObject *na_object = descr->na_object;
269281

270282
// setting NA *must* check pointer equality since NA types might not
271283
// allow equality
272284
if (na_object != NULL && obj == na_object) {
273-
if (NpyString_pack_null(allocator, sdata) < 0) {
285+
if (_NpyString_pack_null(allocator, sdata) < 0) {
274286
PyErr_SetString(PyExc_MemoryError,
275287
"Failed to pack null string during StringDType "
276288
"setitem");
@@ -291,7 +303,7 @@ stringdtype_setitem(StringDTypeObject *descr, PyObject *obj, char **dataptr)
291303
goto fail;
292304
}
293305

294-
if (NpyString_pack(allocator, sdata, val, length) < 0) {
306+
if (_NpyString_pack(allocator, sdata, val, length) < 0) {
295307
PyErr_SetString(PyExc_MemoryError,
296308
"Failed to pack string during StringDType "
297309
"setitem");
@@ -301,12 +313,12 @@ stringdtype_setitem(StringDTypeObject *descr, PyObject *obj, char **dataptr)
301313
Py_DECREF(val_obj);
302314
}
303315

304-
NpyString_release_allocator(descr);
316+
_NpyString_release_allocator(descr);
305317

306318
return 0;
307319

308320
fail:
309-
NpyString_release_allocator(descr);
321+
_NpyString_release_allocator(descr);
310322

311323
return -1;
312324
}
@@ -316,10 +328,10 @@ stringdtype_getitem(StringDTypeObject *descr, char **dataptr)
316328
{
317329
PyObject *val_obj = NULL;
318330
npy_packed_static_string *psdata = (npy_packed_static_string *)dataptr;
319-
npy_static_string sdata = {0, NULL};
331+
_npy_static_string sdata = {0, NULL};
320332
int hasnull = descr->na_object != NULL;
321-
npy_string_allocator *allocator = NpyString_acquire_allocator(descr);
322-
int is_null = NpyString_load(allocator, psdata, &sdata);
333+
npy_string_allocator *allocator = _NpyString_acquire_allocator(descr);
334+
int is_null = _NpyString_load(allocator, psdata, &sdata);
323335

324336
if (is_null < 0) {
325337
PyErr_SetString(PyExc_MemoryError,
@@ -344,7 +356,7 @@ stringdtype_getitem(StringDTypeObject *descr, char **dataptr)
344356
}
345357
}
346358

347-
NpyString_release_allocator(descr);
359+
_NpyString_release_allocator(descr);
348360

349361
/*
350362
* In principle we should return a StringScalar instance here, but
@@ -361,7 +373,7 @@ stringdtype_getitem(StringDTypeObject *descr, char **dataptr)
361373

362374
fail:
363375

364-
NpyString_release_allocator(descr);
376+
_NpyString_release_allocator(descr);
365377

366378
return NULL;
367379
}
@@ -371,7 +383,7 @@ stringdtype_getitem(StringDTypeObject *descr, char **dataptr)
371383
npy_bool
372384
nonzero(void *data, void *NPY_UNUSED(arr))
373385
{
374-
return NpyString_size((npy_packed_static_string *)data) != 0;
386+
return _NpyString_size((npy_packed_static_string *)data) != 0;
375387
}
376388

377389
// Implementation of PyArray_CompareFunc.
@@ -382,9 +394,9 @@ compare(void *a, void *b, void *arr)
382394
StringDTypeObject *descr = (StringDTypeObject *)PyArray_DESCR(arr);
383395
// ignore the allocator returned by this function
384396
// since _compare needs the descr anyway
385-
NpyString_acquire_allocator(descr);
397+
_NpyString_acquire_allocator(descr);
386398
int ret = _compare(a, b, descr, descr);
387-
NpyString_release_allocator(descr);
399+
_NpyString_release_allocator(descr);
388400
return ret;
389401
}
390402

@@ -400,13 +412,13 @@ _compare(void *a, void *b, StringDTypeObject *descr_a,
400412
int hasnull = descr_a->na_object != NULL;
401413
int has_string_na = descr_a->has_string_na;
402414
int has_nan_na = descr_a->has_nan_na;
403-
npy_static_string *default_string = &descr_a->default_string;
415+
_npy_static_string *default_string = &descr_a->default_string;
404416
const npy_packed_static_string *ps_a = (npy_packed_static_string *)a;
405-
npy_static_string s_a = {0, NULL};
406-
int a_is_null = NpyString_load(allocator_a, ps_a, &s_a);
417+
_npy_static_string s_a = {0, NULL};
418+
int a_is_null = _NpyString_load(allocator_a, ps_a, &s_a);
407419
const npy_packed_static_string *ps_b = (npy_packed_static_string *)b;
408-
npy_static_string s_b = {0, NULL};
409-
int b_is_null = NpyString_load(allocator_b, ps_b, &s_b);
420+
_npy_static_string s_b = {0, NULL};
421+
int b_is_null = _NpyString_load(allocator_b, ps_b, &s_b);
410422
if (NPY_UNLIKELY(a_is_null == -1 || b_is_null == -1)) {
411423
char *msg = "Failed to load string in string comparison";
412424
if (hasnull && !(has_string_na && has_nan_na)) {
@@ -450,7 +462,7 @@ _compare(void *a, void *b, StringDTypeObject *descr_a,
450462
}
451463
}
452464
}
453-
return NpyString_cmp(&s_a, &s_b);
465+
return _NpyString_cmp(&s_a, &s_b);
454466
}
455467

456468
// PyArray_ArgFunc
@@ -494,25 +506,25 @@ stringdtype_ensure_canonical(StringDTypeObject *self)
494506

495507
static int
496508
stringdtype_clear_loop(void *NPY_UNUSED(traverse_context),
497-
PyArray_Descr *descr, char *data, npy_intp size,
509+
const PyArray_Descr *descr, char *data, npy_intp size,
498510
npy_intp stride, NpyAuxData *NPY_UNUSED(auxdata))
499511
{
500512
StringDTypeObject *sdescr = (StringDTypeObject *)descr;
501-
npy_string_allocator *allocator = NpyString_acquire_allocator(sdescr);
513+
npy_string_allocator *allocator = _NpyString_acquire_allocator(sdescr);
502514
while (size--) {
503515
npy_packed_static_string *sdata = (npy_packed_static_string *)data;
504-
if (data != NULL && NpyString_free(sdata, allocator) < 0) {
516+
if (data != NULL && _NpyString_free(sdata, allocator) < 0) {
505517
gil_error(PyExc_MemoryError,
506518
"String deallocation failed in clear loop");
507519
goto fail;
508520
}
509521
data += stride;
510522
}
511-
NpyString_release_allocator(sdescr);
523+
_NpyString_release_allocator(sdescr);
512524
return 0;
513525

514526
fail:
515-
NpyString_release_allocator(sdescr);
527+
_NpyString_release_allocator(sdescr);
516528
return -1;
517529
}
518530

@@ -521,7 +533,7 @@ stringdtype_get_clear_loop(void *NPY_UNUSED(traverse_context),
521533
PyArray_Descr *NPY_UNUSED(descr),
522534
int NPY_UNUSED(aligned),
523535
npy_intp NPY_UNUSED(fixed_stride),
524-
traverse_loop_function **out_loop,
536+
PyArrayMethod_TraverseLoop **out_loop,
525537
NpyAuxData **NPY_UNUSED(out_auxdata),
526538
NPY_ARRAYMETHOD_FLAGS *flags)
527539
{
@@ -676,7 +688,7 @@ stringdtype_dealloc(StringDTypeObject *self)
676688
if (self->allocator != NULL) {
677689
// can we assume the destructor for an instance will only get called
678690
// inside of one C thread?
679-
NpyString_free_allocator(self->allocator);
691+
_NpyString_free_allocator(self->allocator);
680692
PyThread_free_lock(self->allocator_lock);
681693
}
682694
PyMem_RawFree((char *)self->na_name.buf);
@@ -931,14 +943,14 @@ free_and_copy(npy_string_allocator *in_allocator,
931943
const npy_packed_static_string *in,
932944
npy_packed_static_string *out, const char *location)
933945
{
934-
if (NpyString_free(out, out_allocator) < 0) {
946+
if (_NpyString_free(out, out_allocator) < 0) {
935947
char message[200];
936948
snprintf(message, sizeof(message), "Failed to deallocate string in %s",
937949
location);
938950
gil_error(PyExc_MemoryError, message);
939951
return -1;
940952
}
941-
if (NpyString_dup(in, out, in_allocator, out_allocator) < 0) {
953+
if (_NpyString_dup(in, out, in_allocator, out_allocator) < 0) {
942954
char message[200];
943955
snprintf(message, sizeof(message), "Failed to allocate string in %s",
944956
location);

stringdtype/stringdtype/src/dtype.h

+16-27
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,6 @@
88

99
#include "static_string.h"
1010

11-
#define PY_ARRAY_UNIQUE_SYMBOL stringdtype_ARRAY_API
12-
#define NPY_NO_DEPRECATED_API NPY_2_0_API_VERSION
13-
#define NPY_TARGET_VERSION NPY_2_0_API_VERSION
14-
#define NO_IMPORT_ARRAY
15-
#include "numpy/arrayobject.h"
16-
#include "numpy/experimental_dtype_api.h"
17-
#include "numpy/halffloat.h"
18-
#include "numpy/ndarraytypes.h"
19-
#include "numpy/npy_math.h"
20-
#include "numpy/ufuncobject.h"
21-
2211
// not publicly exposed by the static string library so we need to define
2312
// this here so we can define `elsize` and `alignment` on the descr
2413
//
@@ -34,8 +23,8 @@ typedef struct {
3423
int has_nan_na;
3524
int has_string_na;
3625
int array_owned;
37-
npy_static_string default_string;
38-
npy_static_string na_name;
26+
_npy_static_string default_string;
27+
_npy_static_string na_name;
3928
PyThread_type_lock *allocator_lock;
4029
// the allocator should only be directly accessed after
4130
// acquiring the allocator_lock and the lock should
@@ -52,7 +41,7 @@ extern StringDType_type StringDType;
5241
extern PyTypeObject *StringScalar_Type;
5342

5443
static inline npy_string_allocator *
55-
NpyString_acquire_allocator(StringDTypeObject *descr)
44+
_NpyString_acquire_allocator(StringDTypeObject *descr)
5645
{
5746
if (!PyThread_acquire_lock(descr->allocator_lock, NOWAIT_LOCK)) {
5847
PyThread_acquire_lock(descr->allocator_lock, WAIT_LOCK);
@@ -61,61 +50,61 @@ NpyString_acquire_allocator(StringDTypeObject *descr)
6150
}
6251

6352
static inline void
64-
NpyString_acquire_allocator2(StringDTypeObject *descr1,
53+
_NpyString_acquire_allocator2(StringDTypeObject *descr1,
6554
StringDTypeObject *descr2,
6655
npy_string_allocator **allocator1,
6756
npy_string_allocator **allocator2)
6857
{
69-
*allocator1 = NpyString_acquire_allocator(descr1);
58+
*allocator1 = _NpyString_acquire_allocator(descr1);
7059
if (descr1 != descr2) {
71-
*allocator2 = NpyString_acquire_allocator(descr2);
60+
*allocator2 = _NpyString_acquire_allocator(descr2);
7261
}
7362
else {
7463
*allocator2 = *allocator1;
7564
}
7665
}
7766

7867
static inline void
79-
NpyString_acquire_allocator3(StringDTypeObject *descr1,
68+
_NpyString_acquire_allocator3(StringDTypeObject *descr1,
8069
StringDTypeObject *descr2,
8170
StringDTypeObject *descr3,
8271
npy_string_allocator **allocator1,
8372
npy_string_allocator **allocator2,
8473
npy_string_allocator **allocator3)
8574
{
86-
NpyString_acquire_allocator2(descr1, descr2, allocator1, allocator2);
75+
_NpyString_acquire_allocator2(descr1, descr2, allocator1, allocator2);
8776
if (descr1 != descr3 && descr2 != descr3) {
88-
*allocator3 = NpyString_acquire_allocator(descr3);
77+
*allocator3 = _NpyString_acquire_allocator(descr3);
8978
}
9079
else {
9180
*allocator3 = descr3->allocator;
9281
}
9382
}
9483

9584
static inline void
96-
NpyString_release_allocator(StringDTypeObject *descr)
85+
_NpyString_release_allocator(StringDTypeObject *descr)
9786
{
9887
PyThread_release_lock(descr->allocator_lock);
9988
}
10089

10190
static inline void
102-
NpyString_release_allocator2(StringDTypeObject *descr1,
91+
_NpyString_release_allocator2(StringDTypeObject *descr1,
10392
StringDTypeObject *descr2)
10493
{
105-
NpyString_release_allocator(descr1);
94+
_NpyString_release_allocator(descr1);
10695
if (descr1 != descr2) {
107-
NpyString_release_allocator(descr2);
96+
_NpyString_release_allocator(descr2);
10897
}
10998
}
11099

111100
static inline void
112-
NpyString_release_allocator3(StringDTypeObject *descr1,
101+
_NpyString_release_allocator3(StringDTypeObject *descr1,
113102
StringDTypeObject *descr2,
114103
StringDTypeObject *descr3)
115104
{
116-
NpyString_release_allocator2(descr1, descr2);
105+
_NpyString_release_allocator2(descr1, descr2);
117106
if (descr1 != descr3 && descr2 != descr3) {
118-
NpyString_release_allocator(descr3);
107+
_NpyString_release_allocator(descr3);
119108
}
120109
}
121110

0 commit comments

Comments
 (0)