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
308320fail :
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
362374fail :
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)
371383npy_bool
372384nonzero (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
495507static int
496508stringdtype_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
514526fail :
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 );
0 commit comments