Skip to content

Commit 984387f

Browse files
GH-92123: Store _elementtree state in type contexts (#101190)
- add state pointer to TreeBuilderObject - add state pointer to XMLParserObject
1 parent 5d868ef commit 984387f

File tree

1 file changed

+21
-17
lines changed

1 file changed

+21
-17
lines changed

Modules/_elementtree.c

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2306,6 +2306,7 @@ typedef struct {
23062306

23072307
char insert_comments;
23082308
char insert_pis;
2309+
elementtreestate *state;
23092310
} TreeBuilderObject;
23102311

23112312
#define TreeBuilder_CheckExact(st, op) Py_IS_TYPE((op), (st)->TreeBuilder_Type)
@@ -2339,6 +2340,7 @@ treebuilder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
23392340
t->start_ns_event_obj = t->end_ns_event_obj = NULL;
23402341
t->comment_event_obj = t->pi_event_obj = NULL;
23412342
t->insert_comments = t->insert_pis = 0;
2343+
t->state = ET_STATE_GLOBAL;
23422344
}
23432345
return (PyObject *)t;
23442346
}
@@ -2370,7 +2372,7 @@ _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self,
23702372
}
23712373

23722374
if (comment_factory == Py_None) {
2373-
elementtreestate *st = ET_STATE_GLOBAL;
2375+
elementtreestate *st = self->state;
23742376
comment_factory = st->comment_factory;
23752377
}
23762378
if (comment_factory) {
@@ -2382,7 +2384,7 @@ _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self,
23822384
}
23832385

23842386
if (pi_factory == Py_None) {
2385-
elementtreestate *st = ET_STATE_GLOBAL;
2387+
elementtreestate *st = self->state;
23862388
pi_factory = st->pi_factory;
23872389
}
23882390
if (pi_factory) {
@@ -2564,7 +2566,7 @@ treebuilder_flush_data(TreeBuilderObject* self)
25642566
if (!self->data) {
25652567
return 0;
25662568
}
2567-
elementtreestate *st = ET_STATE_GLOBAL;
2569+
elementtreestate *st = self->state;
25682570
if (!self->last_for_tail) {
25692571
PyObject *element = self->last;
25702572
return treebuilder_extend_element_text_or_tail(
@@ -2624,7 +2626,7 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
26242626
{
26252627
PyObject* node;
26262628
PyObject* this;
2627-
elementtreestate *st = ET_STATE_GLOBAL;
2629+
elementtreestate *st = self->state;
26282630

26292631
if (treebuilder_flush_data(self) < 0) {
26302632
return NULL;
@@ -3013,6 +3015,7 @@ typedef struct {
30133015

30143016
PyObject *handle_close;
30153017

3018+
elementtreestate *state;
30163019
} XMLParserObject;
30173020

30183021
/* helpers */
@@ -3158,7 +3161,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
31583161
value = PyDict_GetItemWithError(self->entity, key);
31593162

31603163
if (value) {
3161-
elementtreestate *st = ET_STATE_GLOBAL;
3164+
elementtreestate *st = self->state;
31623165
if (TreeBuilder_CheckExact(st, self->target))
31633166
res = treebuilder_handle_data(
31643167
(TreeBuilderObject*) self->target, value
@@ -3231,7 +3234,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
32313234
attrib = NULL;
32323235
}
32333236

3234-
elementtreestate *st = ET_STATE_GLOBAL;
3237+
elementtreestate *st = self->state;
32353238
if (TreeBuilder_CheckExact(st, self->target)) {
32363239
/* shortcut */
32373240
res = treebuilder_handle_start((TreeBuilderObject*) self->target,
@@ -3270,7 +3273,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
32703273
if (!data)
32713274
return; /* parser will look for errors */
32723275

3273-
elementtreestate *st = ET_STATE_GLOBAL;
3276+
elementtreestate *st = self->state;
32743277
if (TreeBuilder_CheckExact(st, self->target))
32753278
/* shortcut */
32763279
res = treebuilder_handle_data((TreeBuilderObject*) self->target, data);
@@ -3293,7 +3296,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
32933296
if (PyErr_Occurred())
32943297
return;
32953298

3296-
elementtreestate *st = ET_STATE_GLOBAL;
3299+
elementtreestate *st = self->state;
32973300
if (TreeBuilder_CheckExact(st, self->target))
32983301
/* shortcut */
32993302
/* the standard tree builder doesn't look at the end tag */
@@ -3328,7 +3331,7 @@ expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix_in,
33283331
if (!prefix_in)
33293332
prefix_in = "";
33303333

3331-
elementtreestate *st = ET_STATE_GLOBAL;
3334+
elementtreestate *st = self->state;
33323335
if (TreeBuilder_CheckExact(st, self->target)) {
33333336
/* shortcut - TreeBuilder does not actually implement .start_ns() */
33343337
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3379,7 +3382,7 @@ expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in)
33793382
if (!prefix_in)
33803383
prefix_in = "";
33813384

3382-
elementtreestate *st = ET_STATE_GLOBAL;
3385+
elementtreestate *st = self->state;
33833386
if (TreeBuilder_CheckExact(st, self->target)) {
33843387
/* shortcut - TreeBuilder does not actually implement .end_ns() */
33853388
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3408,7 +3411,7 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
34083411
if (PyErr_Occurred())
34093412
return;
34103413

3411-
elementtreestate *st = ET_STATE_GLOBAL;
3414+
elementtreestate *st = self->state;
34123415
if (TreeBuilder_CheckExact(st, self->target)) {
34133416
/* shortcut */
34143417
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3469,7 +3472,7 @@ expat_start_doctype_handler(XMLParserObject *self,
34693472
pubid_obj = Py_NewRef(Py_None);
34703473
}
34713474

3472-
elementtreestate *st = ET_STATE_GLOBAL;
3475+
elementtreestate *st = self->state;
34733476
/* If the target has a handler for doctype, call it. */
34743477
if (self->handle_doctype) {
34753478
res = PyObject_CallFunctionObjArgs(self->handle_doctype,
@@ -3502,7 +3505,7 @@ expat_pi_handler(XMLParserObject* self, const XML_Char* target_in,
35023505
if (PyErr_Occurred())
35033506
return;
35043507

3505-
elementtreestate *st = ET_STATE_GLOBAL;
3508+
elementtreestate *st = self->state;
35063509
if (TreeBuilder_CheckExact(st, self->target)) {
35073510
/* shortcut */
35083511
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3555,6 +3558,7 @@ xmlparser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
35553558
self->handle_start = self->handle_data = self->handle_end = NULL;
35563559
self->handle_comment = self->handle_pi = self->handle_close = NULL;
35573560
self->handle_doctype = NULL;
3561+
self->state = ET_STATE_GLOBAL;
35583562
}
35593563
return (PyObject *)self;
35603564
}
@@ -3611,7 +3615,7 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target,
36113615
if (target != Py_None) {
36123616
Py_INCREF(target);
36133617
} else {
3614-
elementtreestate *st = ET_STATE_GLOBAL;
3618+
elementtreestate *st = self->state;
36153619
target = treebuilder_new(st->TreeBuilder_Type, NULL, NULL);
36163620
if (!target) {
36173621
Py_CLEAR(self->entity);
@@ -3813,7 +3817,7 @@ _elementtree_XMLParser_close_impl(XMLParserObject *self)
38133817
if (!res)
38143818
return NULL;
38153819

3816-
elementtreestate *st = ET_STATE_GLOBAL;
3820+
elementtreestate *st = self->state;
38173821
if (TreeBuilder_CheckExact(st, self->target)) {
38183822
Py_DECREF(res);
38193823
return treebuilder_done((TreeBuilderObject*) self->target);
@@ -3953,7 +3957,7 @@ _elementtree_XMLParser__parse_whole(XMLParserObject *self, PyObject *file)
39533957

39543958
res = expat_parse(self, "", 0, 1);
39553959

3956-
elementtreestate *st = ET_STATE_GLOBAL;
3960+
elementtreestate *st = self->state;
39573961
if (res && TreeBuilder_CheckExact(st, self->target)) {
39583962
Py_DECREF(res);
39593963
return treebuilder_done((TreeBuilderObject*) self->target);
@@ -3985,7 +3989,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
39853989
if (!_check_xmlparser(self)) {
39863990
return NULL;
39873991
}
3988-
elementtreestate *st = ET_STATE_GLOBAL;
3992+
elementtreestate *st = self->state;
39893993
if (!TreeBuilder_CheckExact(st, self->target)) {
39903994
PyErr_SetString(
39913995
PyExc_TypeError,

0 commit comments

Comments
 (0)