@@ -86,7 +86,8 @@ typedef enum KeysArrayType{
8686NPY_DATETIMEUNIT
8787dt_unit_from_array (PyArrayObject * a ) {
8888 // This is based on get_datetime_metadata_from_dtype in the NumPy source, but that function is private. This does not check that the dytpe is of the appropriate type.
89- PyArray_DatetimeMetaData * dma = & (((PyArray_DatetimeDTypeMetaData * )PyArray_DESCR (a )-> c_metadata )-> meta );
89+ PyArray_Descr * dt = PyArray_DESCR (a ); // borrowed ref
90+ PyArray_DatetimeMetaData * dma = & (((PyArray_DatetimeDTypeMetaData * )PyDataType_C_METADATA (dt ))-> meta );
9091 return dma -> base ;
9192}
9293
@@ -451,7 +452,6 @@ typedef struct FAMIObject {
451452 Py_ssize_t index ; // current index state, mutated in-place
452453} FAMIObject ;
453454
454-
455455static void
456456fami_dealloc (FAMIObject * self )
457457{
@@ -550,7 +550,6 @@ static PyTypeObject FAMIType = {
550550 .tp_name = "arraymap.FrozenAutoMapIterator" ,
551551};
552552
553-
554553static PyObject *
555554fami_new (FAMObject * fam , ViewKind kind , bool reversed )
556555{
@@ -601,27 +600,23 @@ name(PyObject *left, PyObject *right) \
601600 return result; \
602601}
603602
604-
605603FAMV_SET_OP (famv_and , And )
606604FAMV_SET_OP (famv_or , Or )
607605FAMV_SET_OP (famv_subtract , Subtract )
608606FAMV_SET_OP (famv_xor , Xor )
609607
610608# undef FAMV_SET_OP
611609
612-
613610static PyNumberMethods famv_as_number = {
614611 .nb_and = (binaryfunc ) famv_and ,
615612 .nb_or = (binaryfunc ) famv_or ,
616613 .nb_subtract = (binaryfunc ) famv_subtract ,
617614 .nb_xor = (binaryfunc ) famv_xor ,
618615};
619616
620-
621617static int fam_contains (FAMObject * , PyObject * );
622618static PyObject * famv_fami_new (FAMVObject * );
623619
624-
625620static int
626621famv_contains (FAMVObject * self , PyObject * other )
627622{
@@ -637,41 +632,35 @@ famv_contains(FAMVObject *self, PyObject *other)
637632 return result ;
638633}
639634
640-
641635static PySequenceMethods famv_as_sequence = {
642636 .sq_contains = (objobjproc ) famv_contains ,
643637};
644638
645-
646639static void
647640famv_dealloc (FAMVObject * self )
648641{
649642 Py_DECREF (self -> fam );
650643 PyObject_Del ((PyObject * )self );
651644}
652645
653-
654646static PyObject *
655647famv_fami_new (FAMVObject * self )
656648{
657649 return fami_new (self -> fam , self -> kind , false);
658650}
659651
660-
661652static PyObject *
662653famv_length_hint (FAMVObject * self )
663654{
664655 return PyLong_FromSsize_t (self -> fam -> keys_size );
665656}
666657
667-
668658static PyObject *
669659famv_reversed (FAMVObject * self )
670660{
671661 return fami_new (self -> fam , self -> kind , true);
672662}
673663
674-
675664static PyObject *
676665famv_isdisjoint (FAMVObject * self , PyObject * other )
677666{
@@ -684,7 +673,6 @@ famv_isdisjoint(FAMVObject *self, PyObject *other)
684673 return PyBool_FromLong (result );
685674}
686675
687-
688676static PyObject *
689677famv_richcompare (FAMVObject * self , PyObject * other , int op )
690678{
@@ -703,15 +691,13 @@ famv_richcompare(FAMVObject *self, PyObject *other, int op)
703691 return result ;
704692}
705693
706-
707694static PyMethodDef famv_methods [] = {
708695 {"__length_hint__" , (PyCFunction ) famv_length_hint , METH_NOARGS , NULL },
709696 {"__reversed__" , (PyCFunction ) famv_reversed , METH_NOARGS , NULL },
710697 {"isdisjoint" , (PyCFunction ) famv_isdisjoint , METH_O , NULL },
711698 {NULL },
712699};
713700
714-
715701static PyTypeObject FAMVType = {
716702 PyVarObject_HEAD_INIT (NULL , 0 )
717703 .tp_as_number = & famv_as_number ,
@@ -724,7 +710,6 @@ static PyTypeObject FAMVType = {
724710 .tp_richcompare = (richcmpfunc ) famv_richcompare ,
725711};
726712
727-
728713static PyObject *
729714famv_new (FAMObject * fam , ViewKind kind )
730715{
@@ -941,7 +926,7 @@ lookup_hash_unicode(
941926 Py_ssize_t table_pos = hash & mask ;
942927
943928 PyArrayObject * a = (PyArrayObject * )self -> keys ;
944- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / UCS4_SIZE ;
929+ Py_ssize_t dt_size = PyArray_ITEMSIZE (a ) / UCS4_SIZE ;
945930 Py_ssize_t cmp_bytes = Py_MIN (key_size , dt_size ) * UCS4_SIZE ;
946931
947932 Py_hash_t h = 0 ;
@@ -983,7 +968,7 @@ lookup_hash_string(
983968 Py_ssize_t table_pos = hash & mask ;
984969
985970 PyArrayObject * a = (PyArrayObject * )self -> keys ;
986- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize ;
971+ Py_ssize_t dt_size = PyArray_ITEMSIZE (a );
987972 Py_ssize_t cmp_bytes = Py_MIN (key_size , dt_size );
988973
989974 Py_hash_t h = 0 ;
@@ -1284,7 +1269,7 @@ lookup_unicode(FAMObject *self, PyObject* key) {
12841269 return -1 ;
12851270 }
12861271 PyArrayObject * a = (PyArrayObject * )self -> keys ;
1287- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / UCS4_SIZE ;
1272+ Py_ssize_t dt_size = PyArray_ITEMSIZE (a ) / UCS4_SIZE ;
12881273 // if the key_size is greater than the dtype size of the array, we know there cannot be a match
12891274 Py_ssize_t k_size = PyUnicode_GetLength (key );
12901275 if (k_size > dt_size ) {
@@ -1305,7 +1290,7 @@ lookup_string(FAMObject *self, PyObject* key) {
13051290 return -1 ;
13061291 }
13071292 PyArrayObject * a = (PyArrayObject * )self -> keys ;
1308- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize ;
1293+ Py_ssize_t dt_size = PyArray_ITEMSIZE (a );
13091294 Py_ssize_t k_size = PyBytes_GET_SIZE (key );
13101295 if (k_size > dt_size ) {
13111296 return -1 ;
@@ -1650,7 +1635,7 @@ copy_to_new(PyTypeObject *cls, FAMObject *self, FAMObject *new)
16501635 new -> key_buffer = NULL ;
16511636 if (new -> keys_array_type == KAT_UNICODE ) {
16521637 PyArrayObject * a = (PyArrayObject * )new -> keys ;
1653- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / UCS4_SIZE ;
1638+ Py_ssize_t dt_size = PyArray_ITEMSIZE (a ) / UCS4_SIZE ;
16541639 new -> key_buffer = (Py_UCS4 * )PyMem_Malloc ((dt_size + 1 ) * UCS4_SIZE );
16551640 }
16561641
@@ -1831,7 +1816,7 @@ get(FAMObject *self, PyObject *key, PyObject *missing) {
18311816# define GET_ALL_FLEXIBLE (char_type , get_end_func , lookup_func , hash_func , to_obj_func ) \
18321817{ \
18331818 char_type* v; \
1834- Py_ssize_t dt_size = PyArray_DESCR (key_array)->elsize / sizeof(char_type);\
1819+ Py_ssize_t dt_size = PyArray_ITEMSIZE (key_array) / sizeof(char_type);\
18351820 Py_ssize_t k_size; \
18361821 for (; i < key_size; i++) { \
18371822 v = (char_type*)PyArray_GETPTR1(key_array, i); \
@@ -2019,7 +2004,7 @@ fam_get_all(FAMObject *self, PyObject *key) {
20192004# define GET_ANY_FLEXIBLE (char_type , get_end_func , lookup_func , hash_func ) \
20202005{ \
20212006 char_type* v; \
2022- Py_ssize_t dt_size = PyArray_DESCR (key_array)->elsize / sizeof(char_type);\
2007+ Py_ssize_t dt_size = PyArray_ITEMSIZE (key_array) / sizeof(char_type);\
20232008 Py_ssize_t k_size; \
20242009 for (; i < key_size; i++) { \
20252010 v = (char_type*)PyArray_GETPTR1(key_array, i); \
@@ -2539,13 +2524,13 @@ fam_init(PyObject *self, PyObject *args, PyObject *kwargs)
25392524 break ;
25402525 case KAT_UNICODE : {
25412526 // Over allocate buffer by 1 so there is room for null at end. This buffer is only used in lookup();
2542- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / UCS4_SIZE ;
2527+ Py_ssize_t dt_size = PyArray_ITEMSIZE (a ) / UCS4_SIZE ;
25432528 fam -> key_buffer = (Py_UCS4 * )PyMem_Malloc ((dt_size + 1 ) * UCS4_SIZE );
25442529 INSERT_FLEXIBLE (Py_UCS4 , insert_unicode , ucs4_get_end_p );
25452530 break ;
25462531 }
25472532 case KAT_STRING : {
2548- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize ;
2533+ Py_ssize_t dt_size = PyArray_ITEMSIZE (a );
25492534 INSERT_FLEXIBLE (char , insert_string , char_get_end_p );
25502535 break ;
25512536 }
0 commit comments