@@ -874,23 +874,22 @@ lookdict_index(PyDictKeysObject *k, Py_hash_t hash, Py_ssize_t index)
874
874
Py_UNREACHABLE ();
875
875
}
876
876
877
- typedef void * (* generic_entries_func )(PyDictKeysObject * dk );
878
-
879
877
static inline Py_ALWAYS_INLINE Py_ssize_t
880
878
do_lookup (PyDictObject * mp , PyDictKeysObject * dk , PyObject * key , Py_hash_t hash ,
881
- generic_entries_func entries ,
882
879
Py_ssize_t (* check_lookup )(PyDictObject * , PyDictKeysObject * , void * , Py_ssize_t ix , PyObject * key , Py_hash_t ))
883
880
{
884
- void * ep0 = entries (dk );
881
+ void * ep0 = _DK_ENTRIES (dk );
885
882
size_t mask = DK_MASK (dk );
886
883
size_t perturb = hash ;
887
884
size_t i = (size_t )hash & mask ;
888
885
Py_ssize_t ix ;
889
886
for (;;) {
890
887
ix = dictkeys_get_index (dk , i );
891
888
if (ix >= 0 ) {
892
- ix = check_lookup (mp , dk , ep0 , ix , key , hash );
893
- if (ix != DKIX_DUMMY ) {
889
+ Py_ssize_t cmp = check_lookup (mp , dk , ep0 , ix , key , hash );
890
+ if (cmp < 0 ) {
891
+ return cmp ;
892
+ } else if (cmp ) {
894
893
return ix ;
895
894
}
896
895
}
@@ -903,8 +902,10 @@ do_lookup(PyDictObject *mp, PyDictKeysObject *dk, PyObject *key, Py_hash_t hash,
903
902
// Manual loop unrolling
904
903
ix = dictkeys_get_index (dk , i );
905
904
if (ix >= 0 ) {
906
- ix = check_lookup (mp , dk , ep0 , ix , key , hash );
907
- if (ix != DKIX_DUMMY ) {
905
+ Py_ssize_t cmp = check_lookup (mp , dk , ep0 , ix , key , hash );
906
+ if (cmp < 0 ) {
907
+ return cmp ;
908
+ } else if (cmp ) {
908
909
return ix ;
909
910
}
910
911
}
@@ -917,9 +918,9 @@ do_lookup(PyDictObject *mp, PyDictKeysObject *dk, PyObject *key, Py_hash_t hash,
917
918
Py_UNREACHABLE ();
918
919
}
919
920
920
- static inline Py_ALWAYS_INLINE
921
- Py_ssize_t compare_unicode_generic (PyDictObject * mp , PyDictKeysObject * dk ,
922
- void * ep0 , Py_ssize_t ix , PyObject * key , Py_hash_t hash )
921
+ static inline Py_ALWAYS_INLINE Py_ssize_t
922
+ compare_unicode_generic (PyDictObject * mp , PyDictKeysObject * dk ,
923
+ void * ep0 , Py_ssize_t ix , PyObject * key , Py_hash_t hash )
923
924
{
924
925
PyDictUnicodeEntry * ep = & ((PyDictUnicodeEntry * )ep0 )[ix ];
925
926
assert (ep -> me_key != NULL );
@@ -936,53 +937,51 @@ Py_ssize_t compare_unicode_generic(PyDictObject *mp, PyDictKeysObject *dk,
936
937
return DKIX_ERROR ;
937
938
}
938
939
if (dk == mp -> ma_keys && ep -> me_key == startkey ) {
939
- if (cmp > 0 ) {
940
- return ix ;
941
- }
940
+ return cmp ;
942
941
}
943
942
else {
944
943
/* The dict was mutated, restart */
945
944
return DKIX_KEY_CHANGED ;
946
945
}
947
946
}
948
- return DKIX_DUMMY ;
947
+ return 0 ;
949
948
}
950
949
951
950
// Search non-Unicode key from Unicode table
952
951
static Py_ssize_t
953
952
unicodekeys_lookup_generic (PyDictObject * mp , PyDictKeysObject * dk , PyObject * key , Py_hash_t hash )
954
953
{
955
- return do_lookup (mp , dk , key , hash , ( generic_entries_func ) DK_UNICODE_ENTRIES , compare_unicode_generic );
954
+ return do_lookup (mp , dk , key , hash , compare_unicode_generic );
956
955
}
957
956
958
- static inline Py_ALWAYS_INLINE
959
- Py_ssize_t compare_unicode_unicode (PyDictObject * mp , PyDictKeysObject * dk ,
960
- void * ep0 , Py_ssize_t ix , PyObject * key , Py_hash_t hash )
957
+ static inline Py_ALWAYS_INLINE Py_ssize_t
958
+ compare_unicode_unicode (PyDictObject * mp , PyDictKeysObject * dk ,
959
+ void * ep0 , Py_ssize_t ix , PyObject * key , Py_hash_t hash )
961
960
{
962
961
PyDictUnicodeEntry * ep = & ((PyDictUnicodeEntry * )ep0 )[ix ];
963
962
assert (ep -> me_key != NULL );
964
963
assert (PyUnicode_CheckExact (ep -> me_key ));
965
964
if (ep -> me_key == key ||
966
965
(unicode_get_hash (ep -> me_key ) == hash && unicode_eq (ep -> me_key , key ))) {
967
- return ix ;
966
+ return 1 ;
968
967
}
969
- return DKIX_DUMMY ;
968
+ return 0 ;
970
969
}
971
970
972
971
static Py_ssize_t _Py_HOT_FUNCTION
973
972
unicodekeys_lookup_unicode (PyDictKeysObject* dk , PyObject * key , Py_hash_t hash )
974
973
{
975
- return do_lookup (NULL , dk , key , hash , ( generic_entries_func ) DK_UNICODE_ENTRIES , compare_unicode_unicode );
974
+ return do_lookup (NULL , dk , key , hash , compare_unicode_unicode );
976
975
}
977
976
978
- static inline Py_ALWAYS_INLINE
979
- Py_ssize_t compare_generic (PyDictObject * mp , PyDictKeysObject * dk ,
980
- void * ep0 , Py_ssize_t ix , PyObject * key , Py_hash_t hash )
977
+ static inline Py_ALWAYS_INLINE Py_ssize_t
978
+ compare_generic (PyDictObject * mp , PyDictKeysObject * dk ,
979
+ void * ep0 , Py_ssize_t ix , PyObject * key , Py_hash_t hash )
981
980
{
982
981
PyDictKeyEntry * ep = & ((PyDictKeyEntry * )ep0 )[ix ];
983
982
assert (ep -> me_key != NULL );
984
983
if (ep -> me_key == key ) {
985
- return ix ;
984
+ return 1 ;
986
985
}
987
986
if (ep -> me_hash == hash ) {
988
987
PyObject * startkey = ep -> me_key ;
@@ -993,22 +992,20 @@ Py_ssize_t compare_generic(PyDictObject *mp, PyDictKeysObject *dk,
993
992
return DKIX_ERROR ;
994
993
}
995
994
if (dk == mp -> ma_keys && ep -> me_key == startkey ) {
996
- if (cmp > 0 ) {
997
- return ix ;
998
- }
995
+ return cmp ;
999
996
}
1000
997
else {
1001
998
/* The dict was mutated, restart */
1002
999
return DKIX_KEY_CHANGED ;
1003
1000
}
1004
1001
}
1005
- return DKIX_DUMMY ;
1002
+ return 0 ;
1006
1003
}
1007
1004
1008
1005
static Py_ssize_t
1009
1006
dictkeys_generic_lookup (PyDictObject * mp , PyDictKeysObject * dk , PyObject * key , Py_hash_t hash )
1010
1007
{
1011
- return do_lookup (mp , dk , key , hash , ( generic_entries_func ) DK_ENTRIES , compare_generic );
1008
+ return do_lookup (mp , dk , key , hash , compare_generic );
1012
1009
}
1013
1010
1014
1011
/* Lookup a string in a (all unicode) dict keys.
0 commit comments