]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
dict_popitem(): Repaired last-second 2.1 comment, which misidentified the
authorTim Peters <tim.peters@gmail.com>
Sat, 2 Jun 2001 05:42:29 +0000 (05:42 +0000)
committerTim Peters <tim.peters@gmail.com>
Sat, 2 Jun 2001 05:42:29 +0000 (05:42 +0000)
true reason for allocating the tuple before checking the dict size.

Objects/dictobject.c

index 754c75055be828a39ab89355ec154c0a4ba10048..857b3c6ffd514d9cd30f1350c2403070f841d583 100644 (file)
@@ -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)