Skip to content

Commit 90f9991

Browse files
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 <storchaka@gmail.com>
1 parent fb8d8d9 commit 90f9991

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

Modules/_elementtree.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2840,8 +2840,6 @@ treebuilder_handle_data(TreeBuilderObject* self, PyObject* data)
28402840
LOCAL(PyObject*)
28412841
treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag)
28422842
{
2843-
PyObject* item;
2844-
28452843
if (treebuilder_flush_data(self) < 0) {
28462844
return NULL;
28472845
}
@@ -2854,17 +2852,22 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag)
28542852
return NULL;
28552853
}
28562854

2857-
item = self->last;
2858-
self->last = Py_NewRef(self->this);
2859-
Py_XSETREF(self->last_for_tail, self->last);
2855+
PyObject *last = self->last;
2856+
PyObject *last_for_tail = self->last_for_tail;
2857+
PyObject *this = self->this;
2858+
self->last = Py_NewRef(this);
2859+
self->last_for_tail = Py_NewRef(this);
28602860
self->index--;
28612861
self->this = Py_NewRef(PyList_GET_ITEM(self->stack, self->index));
2862-
Py_DECREF(item);
2862+
Py_DECREF(last);
2863+
Py_XDECREF(last_for_tail);
28632864

2864-
if (treebuilder_append_event(self, self->end_event_obj, self->last) < 0)
2865+
if (treebuilder_append_event(self, self->end_event_obj, self->last) < 0) {
2866+
Py_DECREF(this);
28652867
return NULL;
2868+
}
28662869

2867-
return Py_NewRef(self->last);
2870+
return this;
28682871
}
28692872

28702873
LOCAL(PyObject*)

0 commit comments

Comments
 (0)