Skip to content

Commit dd37b9f

Browse files
Store state in ElementObject context
1 parent 84780ea commit dd37b9f

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

Lib/test/test_xml_etree_c.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def test_parser_comes_from_C(self):
232232
@support.cpython_only
233233
class SizeofTest(unittest.TestCase):
234234
def setUp(self):
235-
self.elementsize = support.calcobjsize('5P')
235+
self.elementsize = support.calcobjsize('6P')
236236
# extra
237237
self.extra = struct.calcsize('PnnP4P')
238238

Modules/_elementtree.c

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ typedef struct {
230230

231231
PyObject *weakreflist; /* For tp_weaklistoffset */
232232

233+
elementtreestate *state;
233234
} ElementObject;
234235

235236

@@ -309,6 +310,7 @@ create_new_element(elementtreestate *st, PyObject *tag, PyObject *attrib)
309310
self->text = Py_NewRef(Py_None);
310311
self->tail = Py_NewRef(Py_None);
311312
self->weakreflist = NULL;
313+
self->state = ET_STATE_GLOBAL;
312314

313315
PyObject_GC_Track(self);
314316

@@ -332,6 +334,7 @@ element_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
332334
e->tail = Py_NewRef(Py_None);
333335
e->extra = NULL;
334336
e->weakreflist = NULL;
337+
e->state = ET_STATE_GLOBAL;
335338
}
336339
return (PyObject *)e;
337340
}
@@ -418,6 +421,7 @@ element_init(PyObject *self, PyObject *args, PyObject *kwds)
418421
}
419422

420423
self_elem = (ElementObject *)self;
424+
self_elem->state = ET_STATE_GLOBAL;
421425

422426
if (attrib != NULL && !is_empty_dict(attrib)) {
423427
if (create_extra(self_elem, attrib) < 0) {
@@ -506,7 +510,7 @@ LOCAL(int)
506510
element_add_subelement(ElementObject* self, PyObject* element)
507511
{
508512
/* add a child element to a parent */
509-
elementtreestate *st = ET_STATE_GLOBAL;
513+
elementtreestate *st = self->state;
510514
if (!Element_Check(st, element)) {
511515
raise_type_error(element);
512516
return -1;
@@ -727,7 +731,7 @@ _elementtree_Element___copy___impl(ElementObject *self)
727731
{
728732
Py_ssize_t i;
729733
ElementObject* element;
730-
elementtreestate *st = ET_STATE_GLOBAL;
734+
elementtreestate *st = self->state;
731735

732736
element = (ElementObject*) create_new_element(
733737
st, self->tag, self->extra ? self->extra->attrib : NULL);
@@ -781,7 +785,7 @@ _elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo)
781785
PyObject* tail;
782786
PyObject* id;
783787

784-
elementtreestate *st = ET_STATE_GLOBAL;
788+
elementtreestate *st = self->state;
785789
tag = deepcopy(st, self->tag, memo);
786790
if (!tag)
787791
return NULL;
@@ -1031,7 +1035,7 @@ element_setstate_from_attributes(ElementObject *self,
10311035
}
10321036

10331037
/* Copy children */
1034-
elementtreestate *st = ET_STATE_GLOBAL;
1038+
elementtreestate *st = self->state;
10351039
for (i = 0; i < nchildren; i++) {
10361040
PyObject *child = PyList_GET_ITEM(children, i);
10371041
if (!Element_Check(st, child)) {
@@ -1218,7 +1222,7 @@ _elementtree_Element_find_impl(ElementObject *self, PyObject *path,
12181222
/*[clinic end generated code: output=41b43f0f0becafae input=359b6985f6489d2e]*/
12191223
{
12201224
Py_ssize_t i;
1221-
elementtreestate *st = ET_STATE_GLOBAL;
1225+
elementtreestate *st = self->state;
12221226

12231227
if (checkpath(path) || namespaces != Py_None) {
12241228
return PyObject_CallMethodObjArgs(
@@ -1261,7 +1265,7 @@ _elementtree_Element_findtext_impl(ElementObject *self, PyObject *path,
12611265
/*[clinic end generated code: output=83b3ba4535d308d2 input=b53a85aa5aa2a916]*/
12621266
{
12631267
Py_ssize_t i;
1264-
elementtreestate *st = ET_STATE_GLOBAL;
1268+
elementtreestate *st = self->state;
12651269

12661270
if (checkpath(path) || namespaces != Py_None)
12671271
return PyObject_CallMethodObjArgs(
@@ -1312,7 +1316,7 @@ _elementtree_Element_findall_impl(ElementObject *self, PyObject *path,
13121316
{
13131317
Py_ssize_t i;
13141318
PyObject* out;
1315-
elementtreestate *st = ET_STATE_GLOBAL;
1319+
elementtreestate *st = self->state;
13161320

13171321
if (checkpath(path) || namespaces != Py_None) {
13181322
return PyObject_CallMethodObjArgs(
@@ -1358,7 +1362,7 @@ _elementtree_Element_iterfind_impl(ElementObject *self, PyObject *path,
13581362
/*[clinic end generated code: output=ecdd56d63b19d40f input=abb974e350fb65c7]*/
13591363
{
13601364
PyObject* tag = path;
1361-
elementtreestate *st = ET_STATE_GLOBAL;
1365+
elementtreestate *st = self->state;
13621366

13631367
return PyObject_CallMethodObjArgs(
13641368
st->elementpath_obj, st->str_iterfind, self, tag, namespaces, NULL);
@@ -1549,7 +1553,7 @@ _elementtree_Element_makeelement_impl(ElementObject *self, PyObject *tag,
15491553
if (!attrib)
15501554
return NULL;
15511555

1552-
elementtreestate *st = ET_STATE_GLOBAL;
1556+
elementtreestate *st = self->state;
15531557
elem = create_new_element(st, tag, attrib);
15541558

15551559
Py_DECREF(attrib);
@@ -1681,7 +1685,7 @@ element_setitem(PyObject* self_, Py_ssize_t index, PyObject* item)
16811685
old = self->extra->children[index];
16821686

16831687
if (item) {
1684-
elementtreestate *st = ET_STATE_GLOBAL;
1688+
elementtreestate *st = self->state;
16851689
if (!Element_Check(st, item)) {
16861690
raise_type_error(item);
16871691
return -1;
@@ -1879,7 +1883,7 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
18791883
}
18801884
}
18811885

1882-
elementtreestate *st = ET_STATE_GLOBAL;
1886+
elementtreestate *st = self->state;
18831887
for (i = 0; i < newlen; i++) {
18841888
PyObject *element = PySequence_Fast_GET_ITEM(seq, i);
18851889
if (!Element_Check(st, element)) {
@@ -2156,7 +2160,7 @@ elementiter_next(ElementIterObject *it)
21562160
}
21572161

21582162
#ifndef NDEBUG
2159-
elementtreestate *st = ET_STATE_GLOBAL;
2163+
elementtreestate *st = elem->state;
21602164
assert(Element_Check(st, extra->children[child_index]));
21612165
#endif
21622166
elem = (ElementObject *)Py_NewRef(extra->children[child_index]);
@@ -2233,7 +2237,7 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext)
22332237
{
22342238
ElementIterObject *it;
22352239

2236-
elementtreestate *st = ET_STATE_GLOBAL;
2240+
elementtreestate *st = self->state;
22372241
it = PyObject_GC_New(ElementIterObject, st->ElementIter_Type);
22382242
if (!it)
22392243
return NULL;

0 commit comments

Comments
 (0)