]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-37596: Clean up the set/frozenset marshalling code (GH-28068)
authorBrandt Bucher <brandt@python.org>
Tue, 31 Aug 2021 16:18:33 +0000 (09:18 -0700)
committerGitHub <noreply@github.com>
Tue, 31 Aug 2021 16:18:33 +0000 (09:18 -0700)
Python/marshal.c

index b69c4d09641da8e48c6b4689078bea14ad77302d..60b818f0dda4ac1bb3f06a26c7953ec329f7955a 100644 (file)
@@ -507,36 +507,39 @@ w_complex_object(PyObject *v, char flag, WFILE *p)
         // to have their elements serialized in a consistent order (even when
         // they have been scrambled by hash randomization). To ensure this, we
         // use an order equivalent to sorted(v, key=marshal.dumps):
-        PyObject *pairs = PyList_New(0);
+        PyObject *pairs = PyList_New(n);
         if (pairs == NULL) {
             p->error = WFERR_NOMEMORY;
             return;
         }
+        Py_ssize_t i = 0;
         while (_PySet_NextEntry(v, &pos, &value, &hash)) {
             PyObject *dump = PyMarshal_WriteObjectToString(value, p->version);
             if (dump == NULL) {
                 p->error = WFERR_UNMARSHALLABLE;
-                goto anyset_done;
+                Py_DECREF(pairs);
+                return;
             }
             PyObject *pair = PyTuple_Pack(2, dump, value);
             Py_DECREF(dump);
-            if (pair == NULL || PyList_Append(pairs, pair)) {
+            if (pair == NULL) {
                 p->error = WFERR_NOMEMORY;
-                Py_XDECREF(pair);
-                goto anyset_done;
+                Py_DECREF(pairs);
+                return;
             }
-            Py_DECREF(pair);
+            PyList_SET_ITEM(pairs, i++, pair);
         }
+        assert(i == n);
         if (PyList_Sort(pairs)) {
             p->error = WFERR_NOMEMORY;
-            goto anyset_done;
+            Py_DECREF(pairs);
+            return;
         }
         for (Py_ssize_t i = 0; i < n; i++) {
             PyObject *pair = PyList_GET_ITEM(pairs, i);
             value = PyTuple_GET_ITEM(pair, 1);
             w_object(value, p);
         }
-    anyset_done:
         Py_DECREF(pairs);
     }
     else if (PyCode_Check(v)) {