From: Victor Stinner Date: Mon, 23 Mar 2026 11:17:54 +0000 (+0100) Subject: gh-146056: Rework ref counting in treebuilder_handle_end() (#146167) X-Git-Tag: v3.15.0a8~209 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=90f9991abb2ef6422ec0ea8330533966a84d8c8f;p=thirdparty%2FPython%2Fcpython.git gh-146056: Rework ref counting in treebuilder_handle_end() (#146167) Use more regular code to handle reference counting in treebuilder_handle_end(). Co-authored-by: Serhiy Storchaka --- diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index e0bc69c5fe22..721670ed9974 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2840,8 +2840,6 @@ treebuilder_handle_data(TreeBuilderObject* self, PyObject* data) LOCAL(PyObject*) treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) { - PyObject* item; - if (treebuilder_flush_data(self) < 0) { return NULL; } @@ -2854,17 +2852,22 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) return NULL; } - item = self->last; - self->last = Py_NewRef(self->this); - Py_XSETREF(self->last_for_tail, self->last); + PyObject *last = self->last; + PyObject *last_for_tail = self->last_for_tail; + PyObject *this = self->this; + self->last = Py_NewRef(this); + self->last_for_tail = Py_NewRef(this); self->index--; self->this = Py_NewRef(PyList_GET_ITEM(self->stack, self->index)); - Py_DECREF(item); + Py_DECREF(last); + Py_XDECREF(last_for_tail); - if (treebuilder_append_event(self, self->end_event_obj, self->last) < 0) + if (treebuilder_append_event(self, self->end_event_obj, self->last) < 0) { + Py_DECREF(this); return NULL; + } - return Py_NewRef(self->last); + return this; } LOCAL(PyObject*)