@@ -2276,6 +2276,22 @@ PyDict_GetItem(PyObject *op, PyObject *key)
22762276 "PyDict_GetItemRef() or PyDict_GetItemWithError()" );
22772277}
22782278
2279+ static void
2280+ dict_unhashtable_type (PyObject * key )
2281+ {
2282+ PyObject * exc = PyErr_GetRaisedException ();
2283+ assert (exc != NULL );
2284+ if (!Py_IS_TYPE (exc , (PyTypeObject * )PyExc_TypeError )) {
2285+ PyErr_SetRaisedException (exc );
2286+ return ;
2287+ }
2288+
2289+ PyErr_Format (PyExc_TypeError ,
2290+ "cannot use '%T' as a dict key (%S)" ,
2291+ key , exc );
2292+ Py_DECREF (exc );
2293+ }
2294+
22792295Py_ssize_t
22802296_PyDict_LookupIndex (PyDictObject * mp , PyObject * key )
22812297{
@@ -2286,6 +2302,7 @@ _PyDict_LookupIndex(PyDictObject *mp, PyObject *key)
22862302
22872303 Py_hash_t hash = _PyObject_HashFast (key );
22882304 if (hash == -1 ) {
2305+ dict_unhashtable_type (key );
22892306 return -1 ;
22902307 }
22912308
@@ -2382,6 +2399,7 @@ PyDict_GetItemRef(PyObject *op, PyObject *key, PyObject **result)
23822399
23832400 Py_hash_t hash = _PyObject_HashFast (key );
23842401 if (hash == -1 ) {
2402+ dict_unhashtable_type (key );
23852403 * result = NULL ;
23862404 return -1 ;
23872405 }
@@ -2397,6 +2415,7 @@ _PyDict_GetItemRef_Unicode_LockHeld(PyDictObject *op, PyObject *key, PyObject **
23972415
23982416 Py_hash_t hash = _PyObject_HashFast (key );
23992417 if (hash == -1 ) {
2418+ dict_unhashtable_type (key );
24002419 * result = NULL ;
24012420 return -1 ;
24022421 }
@@ -2434,6 +2453,7 @@ PyDict_GetItemWithError(PyObject *op, PyObject *key)
24342453 }
24352454 hash = _PyObject_HashFast (key );
24362455 if (hash == -1 ) {
2456+ dict_unhashtable_type (key );
24372457 return NULL ;
24382458 }
24392459
@@ -2591,6 +2611,7 @@ setitem_take2_lock_held(PyDictObject *mp, PyObject *key, PyObject *value)
25912611 assert (PyDict_Check (mp ));
25922612 Py_hash_t hash = _PyObject_HashFast (key );
25932613 if (hash == -1 ) {
2614+ dict_unhashtable_type (key );
25942615 Py_DECREF (key );
25952616 Py_DECREF (value );
25962617 return -1 ;
@@ -2742,6 +2763,7 @@ PyDict_DelItem(PyObject *op, PyObject *key)
27422763 assert (key );
27432764 Py_hash_t hash = _PyObject_HashFast (key );
27442765 if (hash == -1 ) {
2766+ dict_unhashtable_type (key );
27452767 return -1 ;
27462768 }
27472769
@@ -3064,6 +3086,7 @@ pop_lock_held(PyObject *op, PyObject *key, PyObject **result)
30643086
30653087 Py_hash_t hash = _PyObject_HashFast (key );
30663088 if (hash == -1 ) {
3089+ dict_unhashtable_type (key );
30673090 if (result ) {
30683091 * result = NULL ;
30693092 }
@@ -3398,6 +3421,7 @@ dict_subscript(PyObject *self, PyObject *key)
33983421
33993422 hash = _PyObject_HashFast (key );
34003423 if (hash == -1 ) {
3424+ dict_unhashtable_type (key );
34013425 return NULL ;
34023426 }
34033427 ix = _Py_dict_lookup_threadsafe (mp , key , hash , & value );
@@ -4278,6 +4302,7 @@ dict_get_impl(PyDictObject *self, PyObject *key, PyObject *default_value)
42784302
42794303 hash = _PyObject_HashFast (key );
42804304 if (hash == -1 ) {
4305+ dict_unhashtable_type (key );
42814306 return NULL ;
42824307 }
42834308 ix = _Py_dict_lookup_threadsafe (self , key , hash , & val );
@@ -4310,6 +4335,7 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu
43104335
43114336 hash = _PyObject_HashFast (key );
43124337 if (hash == -1 ) {
4338+ dict_unhashtable_type (key );
43134339 if (result ) {
43144340 * result = NULL ;
43154341 }
@@ -4737,8 +4763,8 @@ int
47374763PyDict_Contains (PyObject * op , PyObject * key )
47384764{
47394765 Py_hash_t hash = _PyObject_HashFast (key );
4740-
47414766 if (hash == -1 ) {
4767+ dict_unhashtable_type (key );
47424768 return -1 ;
47434769 }
47444770
@@ -6829,6 +6855,7 @@ _PyDict_SetItem_LockHeld(PyDictObject *dict, PyObject *name, PyObject *value)
68296855 if (value == NULL ) {
68306856 Py_hash_t hash = _PyObject_HashFast (name );
68316857 if (hash == -1 ) {
6858+ dict_unhashtable_type (name );
68326859 return -1 ;
68336860 }
68346861 return delitem_knownhash_lock_held ((PyObject * )dict , name , hash );
0 commit comments