diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -321,12 +321,16 @@ register size_t i; register size_t perturb; register PyDictEntry *freeslot; - register size_t mask = (size_t)mp->ma_mask; - PyDictEntry *ep0 = mp->ma_table; + register size_t mask; + PyDictEntry *ep0; register PyDictEntry *ep; register int cmp; PyObject *startkey; + top: + mask = (size_t)mp->ma_mask; + ep0 = mp->ma_table; + i = (size_t)hash & mask; ep = &ep0[i]; if (ep->me_key == NULL || ep->me_key == key) @@ -347,9 +351,8 @@ return ep; } else { - PyErr_SetString(PyExc_RuntimeError, - "dictionary changed size during lookup"); - return NULL; + /* Emulate tail recursion */ + goto top; } } freeslot = NULL; @@ -376,9 +379,8 @@ return ep; } else { - PyErr_SetString(PyExc_RuntimeError, - "dictionary changed size during lookup"); - return NULL; + /* Emulate tail recursion */ + goto top; } } else if (ep->me_key == dummy && freeslot == NULL)