Index: Objects/dictobject.c =================================================================== --- Objects/dictobject.c (revision 71388) +++ Objects/dictobject.c (working copy) @@ -791,7 +791,27 @@ return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used); } +/* Internal variant of PyDict_SetItem() to be used when the hash value + is already known and the mp object is known to be a real dict. */ + int +_PyDict_SetItemWithHash(PyDictObject *mp, PyObject *key, PyObject *value, long hash) +{ + register Py_ssize_t n_used = mp->ma_used; + + assert(key); + assert(value); + assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */ + Py_INCREF(value); + Py_INCREF(key); + if (insertdict(mp, key, hash, value) != 0) + return -1; + if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2)) + return 0; + return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used); +} + +int PyDict_DelItem(PyObject *op, PyObject *key) { register PyDictObject *mp; @@ -1944,7 +1964,7 @@ val = ep->me_value; if (val == NULL) { val = failobj; - if (PyDict_SetItem((PyObject*)mp, key, failobj)) + if (_PyDict_SetItemWithHash(mp, key, failobj, hash)) val = NULL; } Py_XINCREF(val);