@@ -69,6 +69,10 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
69
69
PyObject * startkey = entry -> key ;
70
70
if (startkey == key )
71
71
return entry ;
72
+ if (PyUnicode_CheckExact (startkey )
73
+ && PyUnicode_CheckExact (key )
74
+ && unicode_eq (startkey , key ))
75
+ return entry ;
72
76
Py_INCREF (startkey );
73
77
cmp = PyObject_RichCompareBool (startkey , key , Py_EQ );
74
78
Py_DECREF (startkey );
@@ -90,6 +94,10 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
90
94
PyObject * startkey = entry -> key ;
91
95
if (startkey == key )
92
96
return entry ;
97
+ if (PyUnicode_CheckExact (startkey )
98
+ && PyUnicode_CheckExact (key )
99
+ && unicode_eq (startkey , key ))
100
+ return entry ;
93
101
Py_INCREF (startkey );
94
102
cmp = PyObject_RichCompareBool (startkey , key , Py_EQ );
95
103
Py_DECREF (startkey );
@@ -115,68 +123,6 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
115
123
return freeslot == NULL ? entry : freeslot ;
116
124
}
117
125
118
- /*
119
- * Hacked up version of set_lookkey which can assume keys are always unicode;
120
- * This means we can always use unicode_eq directly and not have to check to
121
- * see if the comparison altered the table.
122
- */
123
- static setentry *
124
- set_lookkey_unicode (PySetObject * so , PyObject * key , Py_hash_t hash )
125
- {
126
- setentry * table = so -> table ;
127
- setentry * freeslot = NULL ;
128
- setentry * entry ;
129
- size_t perturb = hash ;
130
- size_t mask = so -> mask ;
131
- size_t i = (size_t )hash ;
132
- size_t j ;
133
-
134
- /* Make sure this function doesn't have to handle non-unicode keys,
135
- including subclasses of str; e.g., one reason to subclass
136
- strings is to override __eq__, and for speed we don't cater to
137
- that here. */
138
- if (!PyUnicode_CheckExact (key )) { /* unlikely */
139
- so -> lookup = set_lookkey ;
140
- return set_lookkey (so , key , hash );
141
- }
142
-
143
- entry = & table [i & mask ];
144
- if (entry -> key == NULL )
145
- return entry ;
146
-
147
- while (1 ) {
148
- if (entry -> hash == hash
149
- && (entry -> key == key
150
- || (entry -> key != dummy /* unlikely */
151
- && unicode_eq (entry -> key , key )))) /* likely */
152
- return entry ;
153
- if (entry -> key == dummy && freeslot == NULL )
154
- freeslot = entry ;
155
-
156
- for (j = 1 ; j <= LINEAR_PROBES ; j ++ ) {
157
- entry = & table [(i + j ) & mask ];
158
- if (entry -> key == NULL )
159
- goto found_null ;
160
- if (entry -> hash == hash
161
- && (entry -> key == key
162
- || (entry -> key != dummy /* unlikely */
163
- && unicode_eq (entry -> key , key )))) /* likely */
164
- return entry ;
165
- if (entry -> key == dummy && freeslot == NULL )
166
- freeslot = entry ;
167
- }
168
-
169
- perturb >>= PERTURB_SHIFT ;
170
- i = i * 5 + 1 + perturb ;
171
-
172
- entry = & table [i & mask ];
173
- if (entry -> key == NULL )
174
- goto found_null ;
175
- }
176
- found_null :
177
- return freeslot == NULL ? entry : freeslot ;
178
- }
179
-
180
126
/*
181
127
Internal routine used by set_table_resize() to insert an item which is
182
128
known to be absent from the set. This routine also assumes that
@@ -225,8 +171,7 @@ set_insert_key(PySetObject *so, PyObject *key, Py_hash_t hash)
225
171
{
226
172
setentry * entry ;
227
173
228
- assert (so -> lookup != NULL );
229
- entry = so -> lookup (so , key , hash );
174
+ entry = set_lookkey (so , key , hash );
230
175
if (entry == NULL )
231
176
return -1 ;
232
177
if (entry -> key == NULL ) {
@@ -385,7 +330,7 @@ set_discard_entry(PySetObject *so, setentry *oldentry)
385
330
setentry * entry ;
386
331
PyObject * old_key ;
387
332
388
- entry = ( so -> lookup ) (so , oldentry -> key , oldentry -> hash );
333
+ entry = set_lookkey (so , oldentry -> key , oldentry -> hash );
389
334
if (entry == NULL )
390
335
return -1 ;
391
336
if (entry -> key == NULL || entry -> key == dummy )
@@ -631,7 +576,7 @@ set_contains_entry(PySetObject *so, setentry *entry)
631
576
PyObject * key ;
632
577
setentry * lu_entry ;
633
578
634
- lu_entry = ( so -> lookup ) (so , entry -> key , entry -> hash );
579
+ lu_entry = set_lookkey (so , entry -> key , entry -> hash );
635
580
if (lu_entry == NULL )
636
581
return -1 ;
637
582
key = lu_entry -> key ;
@@ -994,7 +939,6 @@ make_new_set(PyTypeObject *type, PyObject *iterable)
994
939
so -> used = 0 ;
995
940
so -> mask = PySet_MINSIZE - 1 ;
996
941
so -> table = so -> smalltable ;
997
- so -> lookup = set_lookkey_unicode ;
998
942
so -> hash = -1 ;
999
943
so -> finger = 0 ;
1000
944
so -> weakreflist = NULL ;
@@ -1095,7 +1039,6 @@ set_swap_bodies(PySetObject *a, PySetObject *b)
1095
1039
{
1096
1040
Py_ssize_t t ;
1097
1041
setentry * u ;
1098
- setentry * (* f )(PySetObject * so , PyObject * key , Py_ssize_t hash );
1099
1042
setentry tab [PySet_MINSIZE ];
1100
1043
Py_hash_t h ;
1101
1044
@@ -1111,8 +1054,6 @@ set_swap_bodies(PySetObject *a, PySetObject *b)
1111
1054
a -> table = a -> smalltable ;
1112
1055
b -> table = u ;
1113
1056
1114
- f = a -> lookup ; a -> lookup = b -> lookup ; b -> lookup = f ;
1115
-
1116
1057
if (a -> table == a -> smalltable || b -> table == b -> smalltable ) {
1117
1058
memcpy (tab , a -> smalltable , sizeof (tab ));
1118
1059
memcpy (a -> smalltable , b -> smalltable , sizeof (tab ));
0 commit comments