10000 Use 1/0 for successful comparison eq/ne · python/cpython@bd4fba9 · GitHub
[go: up one dir, main page]

Skip to content

Commit bd4fba9

Browse files
committed
Use 1/0 for successful comparison eq/ne
1 parent 64a76c9 commit bd4fba9

File tree

1 file changed

+28
-31
lines changed

1 file changed

+28
-31
lines changed

Objects/dictobject.c

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
879877
static inline Py_ALWAYS_INLINE Py_ssize_t
880878
do_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
952951
static Py_ssize_t
953952
unicodekeys_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

972971
static Py_ssize_t _Py_HOT_FUNCTION
973972
unicodekeys_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

10081005
static Py_ssize_t
10091006
dictkeys_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

Comments
 (0)
0