@@ -86,6 +86,8 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
86
86
int probes ;
87
87
int cmp ;
88
88
89
+ int frozenset = PyFrozenSet_CheckExact (so );
90
+
89
91
while (1 ) {
90
92
entry = & so -> table [i ];
91
93
probes = (i + LINEAR_PROBES <= mask ) ? LINEAR_PROBES : 0 ;
@@ -102,13 +104,20 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
102
104
&& unicode_eq (startkey , key ))
103
105
return entry ;
104
106
table = so -> table ;
105
- Py_INCREF (startkey );
106
- cmp = PyObject_RichCompareBool (startkey , key , Py_EQ );
107
- Py_DECREF (startkey );
108
- if (cmp < 0 )
109
- return NULL ;
110
- if (table != so -> table || entry -> key != startkey )
111
- return set_lookkey (so , key , hash );
107
+ if (frozenset ) {
108
+ cmp = PyObject_RichCompareBool (startkey , key , Py_EQ );
109
+ if (cmp < 0 )
110
+ return NULL ;
111
+ } else {
112
+ // incref startkey because it can be removed from the set by the compare
113
+ Py_INCREF (startkey );
114
+ cmp = PyObject_RichCompareBool (startkey , key , Py_EQ );
115
+ Py_DECREF (startkey );
116
+ if (cmp < 0 )
117
+ return NULL ;
118
+ if (table != so -> table || entry -> key != startkey )
119
+ return set_lookkey (so , key , hash );
120
+ }
112
121
if (cmp > 0 )
113
122
return entry ;
114
123
mask = so -> mask ;
@@ -2235,10 +2244,16 @@ set_contains_lock_held(PySetObject *so, PyObject *key)
2235
2244
int
2236
2245
_PySet_Contains (PySetObject * so , PyObject * key )
2237
2246
{
2247
+ assert (so );
2248
+
2238
2249
int rv ;
2239
- Py_BEGIN_CRITICAL_SECTION (so );
2240
- rv = set_contains_lock_held (so , key );
2241
- Py_END_CRITICAL_SECTION ();
2250
+ if (PyFrozenSet_CheckExact (so )) {
2251
+ rv = set_contains_lock_held (so , key );
2252
+ } else {
2253
+ Py_BEGIN_CRITICAL_SECTION (so );
2254
+ rv = set_contains_lock_held (so , key );
2255
+ Py_END_CRITICAL_SECTION ();
2256
+ }
2242
2257
return rv ;
2243
2258
}
2244
2259
0 commit comments