@@ -42,6 +42,7 @@ typedef struct TableElement{
42
42
# define LOAD 0.9
43
43
# define SCAN 16
44
44
45
+ const static size_t UCS4_SIZE = sizeof (Py_UCS4 );
45
46
46
47
typedef enum KeysArrayType {
47
48
KAT_LIST = 0 , // must be falsy
@@ -790,8 +791,8 @@ lookup_hash_unicode(
790
791
Py_ssize_t table_pos = hash & mask ;
791
792
792
793
PyArrayObject * a = (PyArrayObject * )self -> keys ;
793
- // REVIEW: is this a new descr reference?
794
- Py_ssize_t dt_size = PyArray_DESCR ( a ) -> elsize / sizeof ( Py_UCS4 ) ;
794
+ Py_ssize_t dt_size = PyArray_DESCR ( a ) -> elsize / UCS4_SIZE ;
795
+ Py_ssize_t cmp_bytes = Py_MIN ( key_size , dt_size ) * UCS4_SIZE ;
795
796
796
797
Py_hash_t h = 0 ;
797
798
Py_UCS4 * p_start = NULL ;
@@ -808,7 +809,7 @@ lookup_hash_unicode(
808
809
}
809
810
p_start = (Py_UCS4 * )PyArray_GETPTR1 (a , table [table_pos ].keys_pos );
810
811
// memcmp returns 0 on match
811
- if (!memcmp (p_start , key , Py_MIN ( key_size , dt_size ) )) {
812
+ if (!memcmp (p_start , key , cmp_bytes )) {
812
813
return table_pos ;
813
814
}
814
815
table_pos ++ ;
@@ -833,6 +834,7 @@ lookup_hash_string(
833
834
834
835
PyArrayObject * a = (PyArrayObject * )self -> keys ;
835
836
Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / sizeof (char );
837
+ Py_ssize_t cmp_bytes = Py_MIN (key_size , dt_size );
836
838
837
839
Py_hash_t h = 0 ;
838
840
char * p_start = NULL ;
@@ -849,7 +851,7 @@ lookup_hash_string(
849
851
}
850
852
p_start = (char * )PyArray_GETPTR1 (a , table [table_pos ].keys_pos );
851
853
// memcmp returns 0 on match
852
- if (!memcmp (p_start , key , Py_MIN ( key_size , dt_size ) )) {
854
+ if (!memcmp (p_start , key , cmp_bytes )) {
853
855
return table_pos ;
854
856
}
855
857
table_pos ++ ;
@@ -1110,7 +1112,7 @@ lookup_unicode(FAMObject *self, PyObject* key) {
1110
1112
return -1 ;
1111
1113
}
1112
1114
PyArrayObject * a = (PyArrayObject * )self -> keys ;
1113
- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / sizeof ( Py_UCS4 ) ;
1115
+ Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / UCS4_SIZE ;
1114
1116
// if the key_size is greater than the dtype size of the array, we know there cannot be a match
1115
1117
Py_ssize_t k_size = PyUnicode_GetLength (key );
1116
1118
if (k_size > dt_size ) {
@@ -1435,8 +1437,8 @@ copy_to_new(PyTypeObject *cls, FAMObject *self, FAMObject *new)
1435
1437
new -> key_buffer = NULL ;
1436
1438
if (new -> keys_array_type == KAT_UNICODE ) {
1437
1439
PyArrayObject * a = (PyArrayObject * )new -> keys ;
1438
- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / sizeof ( Py_UCS4 ) ;
1439
- new -> key_buffer = (Py_UCS4 * )PyMem_Malloc ((dt_size + 1 ) * sizeof ( Py_UCS4 ) );
1440
+ Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / UCS4_SIZE ;
1441
+ new -> key_buffer = (Py_UCS4 * )PyMem_Malloc ((dt_size + 1 ) * UCS4_SIZE );
1440
1442
}
1441
1443
1442
1444
Py_ssize_t table_size_alloc = new -> table_size + SCAN - 1 ;
@@ -1922,8 +1924,8 @@ fam_init(PyObject *self, PyObject *args, PyObject *kwargs)
1922
1924
break ;
1923
1925
case KAT_UNICODE : {
1924
1926
// Over allocate buffer by 1 so there is room for null at end. This buffer is only used in lookup();
1925
- Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / sizeof ( Py_UCS4 ) ;
1926
- fam -> key_buffer = (Py_UCS4 * )PyMem_Malloc ((dt_size + 1 ) * sizeof ( Py_UCS4 ) );
1927
+ Py_ssize_t dt_size = PyArray_DESCR (a )-> elsize / UCS4_SIZE ;
1928
+ fam -> key_buffer = (Py_UCS4 * )PyMem_Malloc ((dt_size + 1 ) * UCS4_SIZE );
1927
1929
INSERT_FLEXIBLE (Py_UCS4 , insert_unicode , ucs4_get_end_p );
1928
1930
break ;
1929
1931
}
0 commit comments