@@ -169,7 +169,7 @@ static inline Py_ALWAYS_INLINE int
169169set_compare_frozenset (PySetObject * so , setentry * table , setentry * ep ,
170170 PyObject * key , Py_hash_t hash )
171171{
172- assert (PyFrozenSet_CheckExact (so ));
172+ assert (PyFrozenSet_Check (so ));
173173 PyObject * startkey = ep -> key ;
174174 if (startkey == NULL ) {
175175 return SET_LOOKKEY_EMPTY ;
@@ -2434,6 +2434,7 @@ _PySet_Contains(PySetObject *so, PyObject *key)
24342434 Py_hash_t hash = _PyObject_HashFast (key );
24352435 if (hash == -1 ) {
24362436 if (!PySet_Check (key ) || !PyErr_ExceptionMatches (PyExc_TypeError )) {
2437+ set_unhashable_type (key );
24372438 return -1 ;
24382439 }
24392440 PyErr_Clear ();
@@ -2488,12 +2489,23 @@ static PyObject *
24882489frozenset___contains___impl (PySetObject * so , PyObject * key )
24892490/*[clinic end generated code: output=2301ed91bc3a6dd5 input=2f04922a98d8bab7]*/
24902491{
2491- long result ;
2492-
2493- result = set_contains_lock_held (so , key );
2494- if (result < 0 )
2492+ Py_hash_t hash = _PyObject_HashFast (key );
2493+ if (hash == -1 ) {
2494+ if (!PySet_Check (key ) || !PyErr_ExceptionMatches (PyExc_TypeError )) {
2495+ set_unhashable_type (key );
2496+ return NULL ;
2497+ }
2498+ PyErr_Clear ();
2499+ Py_BEGIN_CRITICAL_SECTION (key );
2500+ hash = frozenset_hash_impl (key );
2501+ Py_END_CRITICAL_SECTION ();
2502+ }
2503+ setentry * entry ; // unused
2504+ int status = set_do_lookup (so , so -> table , so -> mask , key , hash , & entry ,
2505+ set_compare_frozenset );
2506+ if (status < 0 )
24952507 return NULL ;
2496- return PyBool_FromLong (result );
2508+ return PyBool_FromLong (status );
24972509}
24982510
24992511/*[clinic input]
0 commit comments