Skip to content

Commit b2698e2

Browse files
Store state in XMLParserObject context
1 parent b6962cd commit b2698e2

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

Modules/_elementtree.c

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2371,7 +2371,7 @@ _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self,
23712371
}
23722372

23732373
if (pi_factory == Py_None) {
2374-
elementtreestate *st = ET_STATE_GLOBAL;
2374+
elementtreestate *st = self->state;
23752375
pi_factory = st->pi_factory;
23762376
}
23772377
if (pi_factory) {
@@ -3002,6 +3002,7 @@ typedef struct {
30023002

30033003
PyObject *handle_close;
30043004

3005+
elementtreestate *state;
30053006
} XMLParserObject;
30063007

30073008
/* helpers */
@@ -3145,7 +3146,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
31453146

31463147
value = PyDict_GetItemWithError(self->entity, key);
31473148

3148-
elementtreestate *st = ET_STATE_GLOBAL;
3149+
elementtreestate *st = self->state;
31493150
if (value) {
31503151
if (TreeBuilder_CheckExact(st, self->target))
31513152
res = treebuilder_handle_data(
@@ -3220,7 +3221,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
32203221
attrib = NULL;
32213222
}
32223223

3223-
elementtreestate *st = ET_STATE_GLOBAL;
3224+
elementtreestate *st = self->state;
32243225
if (TreeBuilder_CheckExact(st, self->target)) {
32253226
/* shortcut */
32263227
res = treebuilder_handle_start((TreeBuilderObject*) self->target,
@@ -3259,7 +3260,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
32593260
if (!data)
32603261
return; /* parser will look for errors */
32613262

3262-
elementtreestate *st = ET_STATE_GLOBAL;
3263+
elementtreestate *st = self->state;
32633264
if (TreeBuilder_CheckExact(st, self->target))
32643265
/* shortcut */
32653266
res = treebuilder_handle_data((TreeBuilderObject*) self->target, data);
@@ -3282,7 +3283,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
32823283
if (PyErr_Occurred())
32833284
return;
32843285

3285-
elementtreestate *st = ET_STATE_GLOBAL;
3286+
elementtreestate *st = self->state;
32863287
if (TreeBuilder_CheckExact(st, self->target))
32873288
/* shortcut */
32883289
/* the standard tree builder doesn't look at the end tag */
@@ -3317,7 +3318,7 @@ expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix_in,
33173318
if (!prefix_in)
33183319
prefix_in = "";
33193320

3320-
elementtreestate *st = ET_STATE_GLOBAL;
3321+
elementtreestate *st = self->state;
33213322
if (TreeBuilder_CheckExact(st, self->target)) {
33223323
/* shortcut - TreeBuilder does not actually implement .start_ns() */
33233324
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3368,7 +3369,7 @@ expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in)
33683369
if (!prefix_in)
33693370
prefix_in = "";
33703371

3371-
elementtreestate *st = ET_STATE_GLOBAL;
3372+
elementtreestate *st = self->state;
33723373
if (TreeBuilder_CheckExact(st, self->target)) {
33733374
/* shortcut - TreeBuilder does not actually implement .end_ns() */
33743375
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3397,7 +3398,7 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
33973398
if (PyErr_Occurred())
33983399
return;
33993400

3400-
elementtreestate *st = ET_STATE_GLOBAL;
3401+
elementtreestate *st = self->state;
34013402
if (TreeBuilder_CheckExact(st, self->target)) {
34023403
/* shortcut */
34033404
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3458,7 +3459,7 @@ expat_start_doctype_handler(XMLParserObject *self,
34583459
pubid_obj = Py_NewRef(Py_None);
34593460
}
34603461

3461-
elementtreestate *st = ET_STATE_GLOBAL;
3462+
elementtreestate *st = self->state;
34623463
/* If the target has a handler for doctype, call it. */
34633464
if (self->handle_doctype) {
34643465
res = PyObject_CallFunctionObjArgs(self->handle_doctype,
@@ -3491,7 +3492,7 @@ expat_pi_handler(XMLParserObject* self, const XML_Char* target_in,
34913492
if (PyErr_Occurred())
34923493
return;
34933494

3494-
elementtreestate *st = ET_STATE_GLOBAL;
3495+
elementtreestate *st = self->state;
34953496
if (TreeBuilder_CheckExact(st, self->target)) {
34963497
/* shortcut */
34973498
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3544,6 +3545,7 @@ xmlparser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
35443545
self->handle_start = self->handle_data = self->handle_end = NULL;
35453546
self->handle_comment = self->handle_pi = self->handle_close = NULL;
35463547
self->handle_doctype = NULL;
3548+
self->state = ET_STATE_GLOBAL;
35473549
}
35483550
return (PyObject *)self;
35493551
}
@@ -3600,7 +3602,7 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target,
36003602
if (target != Py_None) {
36013603
Py_INCREF(target);
36023604
} else {
3603-
elementtreestate *st = ET_STATE_GLOBAL;
3605+
elementtreestate *st = self->state;
36043606
target = treebuilder_new(st->TreeBuilder_Type, NULL, NULL);
36053607
if (!target) {
36063608
Py_CLEAR(self->entity);
@@ -3770,7 +3772,7 @@ expat_parse(XMLParserObject* self, const char* data, int data_len, int final)
37703772
return NULL;
37713773

37723774
if (!ok) {
3773-
elementtreestate *st = ET_STATE_GLOBAL;
3775+
elementtreestate *st = self->state;
37743776
expat_set_error(
37753777
st,
37763778
EXPAT(GetErrorCode)(self->parser),
@@ -3804,7 +3806,7 @@ _elementtree_XMLParser_close_impl(XMLParserObject *self)
38043806
if (!res)
38053807
return NULL;
38063808

3807-
elementtreestate *st = ET_STATE_GLOBAL;
3809+
elementtreestate *st = self->state;
38083810
if (TreeBuilder_CheckExact(st, self->target)) {
38093811
Py_DECREF(res);
38103812
return treebuilder_done((TreeBuilderObject*) self->target);
@@ -3944,7 +3946,7 @@ _elementtree_XMLParser__parse_whole(XMLParserObject *self, PyObject *file)
39443946

39453947
res = expat_parse(self, "", 0, 1);
39463948

3947-
elementtreestate *st = ET_STATE_GLOBAL;
3949+
elementtreestate *st = self->state;
39483950
if (res && TreeBuilder_CheckExact(st, self->target)) {
39493951
Py_DECREF(res);
39503952
return treebuilder_done((TreeBuilderObject*) self->target);
@@ -3976,7 +3978,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
39763978
if (!_check_xmlparser(self)) {
39773979
return NULL;
39783980
}
3979-
elementtreestate *st = ET_STATE_GLOBAL;
3981+
elementtreestate *st = self->state;
39803982
if (!TreeBuilder_CheckExact(st, self->target)) {
39813983
PyErr_SetString(
39823984
PyExc_TypeError,

0 commit comments

Comments
 (0)