From: Tim Peters Date: Sat, 2 Jun 2001 05:42:29 +0000 (+0000) Subject: dict_popitem(): Repaired last-second 2.1 comment, which misidentified the X-Git-Tag: v2.2a3~1632 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f4b33f61fb83f54d3086ef28c34e71a18ade2b9d;p=thirdparty%2FPython%2Fcpython.git dict_popitem(): Repaired last-second 2.1 comment, which misidentified the true reason for allocating the tuple before checking the dict size. --- diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 754c75055be8..857b3c6ffd51 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1362,11 +1362,14 @@ dict_popitem(dictobject *mp, PyObject *args) if (!PyArg_NoArgs(args)) return NULL; - /* Allocate the result tuple first. Believe it or not, - * this allocation could trigger a garbage collection which - * could resize the dict, which would invalidate the pointer - * (ep) into the dict calculated below. - * So we have to do this first. + /* Allocate the result tuple before checking the size. Believe it + * or not, this allocation could trigger a garbage collection which + * could empty the dict, so if we checked the size first and that + * happened, the result would be an infinite loop (searching for an + * entry that no longer exists). Note that the usual popitem() + * idiom is "while d: k, v = d.popitem()". so needing to throw the + * tuple away if the dict *is* empty isn't a significant + * inefficiency -- possible, but unlikely in practice. */ res = PyTuple_New(2); if (res == NULL)