@@ -874,23 +874,22 @@ lookdict_index(PyDictKeysObject *k, Py_hash_t hash, Py_ssize_t index)
874874 Py_UNREACHABLE ();
875875}
876876
877- typedef void * (* generic_entries_func )(PyDictKeysObject * dk );
878-
879877static inline Py_ALWAYS_INLINE Py_ssize_t
880878do_lookup (PyDictObject * mp , PyDictKeysObject * dk , PyObject * key , Py_hash_t hash ,
881- generic_entries_func entries ,
882879 Py_ssize_t (* check_lookup )(PyDictObject * , PyDictKeysObject * , void * , Py_ssize_t ix , PyObject * key , Py_hash_t ))
883880{
884- void * ep0 = entries (dk );
881+ void * ep0 = _DK_ENTRIES (dk );
885882 size_t mask = DK_MASK (dk );
886883 size_t perturb = hash ;
887884 size_t i = (size_t )hash & mask ;
888885 Py_ssize_t ix ;
889886 for (;;) {
890887 ix = dictkeys_get_index (dk , i );
891888 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 ) {
894893 return ix ;
895894 }
896895 }
@@ -903,8 +902,10 @@ do_lookup(PyDictObject *mp, PyDictKeysObject *dk, PyObject *key, Py_hash_t hash,
903902 // Manual loop unrolling
904903 ix = dictkeys_get_index (dk , i );
905904 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 ) {
908909 return ix ;
909910 }
910911 }
@@ -917,9 +918,9 @@ do_lookup(PyDictObject *mp, PyDictKeysObject *dk, PyObject *key, Py_hash_t hash,
917918 Py_UNREACHABLE ();
918919}
919920
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 )
923924{
924925 PyDictUnicodeEntry * ep = & ((PyDictUnicodeEntry * )ep0 )[ix ];
925926 assert (ep -> me_key != NULL );
@@ -936,53 +937,51 @@ Py_ssize_t compare_unicode_generic(PyDictObject *mp, PyDictKeysObject *dk,
936937 return DKIX_ERROR ;
937938 }
938939 if (dk == mp -> ma_keys && ep -> me_key == startkey ) {
939- if (cmp > 0 ) {
940- return ix ;
941- }
940+ return cmp ;
942941 }
943942 else {
944943 /* The dict was mutated, restart */
945944 return DKIX_KEY_CHANGED ;
946945 }
947946 }
948- return DKIX_DUMMY ;
947+ return 0 ;
949948}
950949
951950// Search non-Unicode key from Unicode table
952951static Py_ssize_t
953952unicodekeys_lookup_generic (PyDictObject * mp , PyDictKeysObject * dk , PyObject * key , Py_hash_t hash )
954953{
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 );
956955}
957956
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 )
961960{
962961 PyDictUnicodeEntry * ep = & ((PyDictUnicodeEntry * )ep0 )[ix ];
963962 assert (ep -> me_key != NULL );
964963 assert (PyUnicode_CheckExact (ep -> me_key ));
965964 if (ep -> me_key == key ||
966965 (unicode_get_hash (ep -> me_key ) == hash && unicode_eq (ep -> me_key , key ))) {
967- return ix ;
966+ return 1 ;
968967 }
969- return DKIX_DUMMY ;
968+ return 0 ;
970969}
971970
972971static Py_ssize_t _Py_HOT_FUNCTION
973972unicodekeys_lookup_unicode (PyDictKeysObject * dk , PyObject * key , Py_hash_t hash )
974973{
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 );
976975}
977976
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 )
981980{
982981 PyDictKeyEntry * ep = & ((PyDictKeyEntry * )ep0 )[ix ];
983982 assert (ep -> me_key != NULL );
984983 if (ep -> me_key == key ) {
985- return ix ;
984+ return 1 ;
986985 }
987986 if (ep -> me_hash == hash ) {
988987 PyObject * startkey = ep -> me_key ;
@@ -993,22 +992,20 @@ Py_ssize_t compare_generic(PyDictObject *mp, PyDictKeysObject *dk,
993992 return DKIX_ERROR ;
994993 }
995994 if (dk == mp -> ma_keys && ep -> me_key == startkey ) {
996- if (cmp > 0 ) {
997- return ix ;
998- }
995+ return cmp ;
999996 }
1000997 else {
1001998 /* The dict was mutated, restart */
1002999 return DKIX_KEY_CHANGED ;
10031000 }
10041001 }
1005- return DKIX_DUMMY ;
1002+ return 0 ;
10061003}
10071004
10081005static Py_ssize_t
10091006dictkeys_generic_lookup (PyDictObject * mp , PyDictKeysObject * dk , PyObject * key , Py_hash_t hash )
10101007{
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 );
10121009}
10131010
10141011/* Lookup a string in a (all unicode) dict keys.
0 commit comments