Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Convert element iter type to heap type
  • Loading branch information
Erlend E. Aasland committed Jan 11, 2021
commit 116fa39aa2b04cf142ae883045de9d33437956f7
63 changes: 19 additions & 44 deletions Modules/_elementtree.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ static void _clear_joined_ptr(PyObject **p)

/* Types defined by this extension */
static PyTypeObject *Element_Type;
static PyTypeObject ElementIter_Type;
static PyTypeObject *ElementIter_Type;
static PyTypeObject TreeBuilder_Type;
static PyTypeObject XMLParser_Type;

Expand Down Expand Up @@ -2095,6 +2095,8 @@ elementiter_dealloc(ElementIterObject *it)
Py_XDECREF(it->root_element);

PyObject_GC_Del(it);
PyTypeObject *tp = Py_TYPE(it);
Py_DECREF(tp);
}

static int
Expand Down Expand Up @@ -2238,59 +2240,33 @@ elementiter_next(ElementIterObject *it)
return NULL;
}

static PyType_Slot elementiter_slots[] = {
{Py_tp_dealloc, elementiter_dealloc},
{Py_tp_traverse, elementiter_traverse},
{Py_tp_iter, PyObject_SelfIter},
{Py_tp_iternext, elementiter_next},
{0, NULL},
};

static PyTypeObject ElementIter_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
static PyType_Spec elementiter_spec = {
/* Using the module's name since the pure-Python implementation does not
have such a type. */
"_elementtree._element_iterator", /* tp_name */
sizeof(ElementIterObject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
(destructor)elementiter_dealloc, /* tp_dealloc */
0, /* tp_vectorcall_offset */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_as_async */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
0, /* tp_doc */
(traverseproc)elementiter_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)elementiter_next, /* tp_iternext */
0, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
0, /* tp_new */
.name = "_elementtree._element_iterator",
.basicsize = sizeof(ElementIterObject),
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
Comment thread
erlend-aasland marked this conversation as resolved.
Outdated
.slots = elementiter_slots,
};

static PyTypeObject *ElementIter_Type = NULL;

#define INIT_PARENT_STACK_SIZE 8

static PyObject *
create_elementiter(ElementObject *self, PyObject *tag, int gettext)
{
ElementIterObject *it;

it = PyObject_GC_New(ElementIterObject, &ElementIter_Type);
it = PyObject_GC_New(ElementIterObject, ElementIter_Type);
if (!it)
return NULL;

Expand Down Expand Up @@ -4382,8 +4358,7 @@ PyInit__elementtree(void)
}

/* Initialize object types */
if (PyType_Ready(&ElementIter_Type) < 0)
goto error;
CREATE_TYPE(m, ElementIter_Type, &elementiter_spec);
if (PyType_Ready(&TreeBuilder_Type) < 0)
goto error;
CREATE_TYPE(m, Element_Type, &element_spec);
Expand Down