From 6b19abb2cda1bc1ef2d335099158446fa5d2ed27 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Fri, 3 Nov 2023 09:40:50 +0100 Subject: [PATCH] gh-106168: Update the size only after setting the item, to avoid temporary inconsistencies. Also remove the "what's new" sentence regarding the size setting since tuples cannot grow after allocation. --- Doc/whatsnew/3.13.rst | 2 -- Include/internal/pycore_list.h | 2 +- Objects/listobject.c | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 5ada880532aad2..da9efb7419da46 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -1048,8 +1048,6 @@ New Features * If Python is built in :ref:`debug mode ` or :option:`with assertions <--with-assertions>`, :c:func:`PyTuple_SET_ITEM` and :c:func:`PyList_SET_ITEM` now check the index argument with an assertion. - If the assertion fails in :c:func:`PyTuple_SET_ITEM`, make sure that the - tuple size is set before. (Contributed by Victor Stinner in :gh:`106168`.) * Add :c:func:`PyModule_Add` function: similar to diff --git a/Include/internal/pycore_list.h b/Include/internal/pycore_list.h index 056be2c80c8ce6..55d67b32bc8a63 100644 --- a/Include/internal/pycore_list.h +++ b/Include/internal/pycore_list.h @@ -51,8 +51,8 @@ _PyList_AppendTakeRef(PyListObject *self, PyObject *newitem) Py_ssize_t allocated = self->allocated; assert((size_t)len + 1 < PY_SSIZE_T_MAX); if (allocated > len) { - Py_SET_SIZE(self, len + 1); PyList_SET_ITEM(self, len, newitem); + Py_SET_SIZE(self, len + 1); return 0; } return _PyList_AppendTakeRefListResize(self, newitem); diff --git a/Objects/listobject.c b/Objects/listobject.c index ad1840b01226ec..af006ef0f61850 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -956,8 +956,8 @@ list_extend(PyListObject *self, PyObject *iterable) if (Py_SIZE(self) < self->allocated) { /* steals ref */ Py_ssize_t len = Py_SIZE(self); - Py_SET_SIZE(self, len + 1); PyList_SET_ITEM(self, len, item); + Py_SET_SIZE(self, len + 1); } else { if (_PyList_AppendTakeRef(self, item) < 0)