Skip to content

Commit b1127be

Browse files
Store state in XMLParserObject context
1 parent 44c5447 commit b1127be

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
@@ -2369,7 +2369,7 @@ _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self,
23692369
}
23702370

23712371
if (pi_factory == Py_None) {
2372-
elementtreestate *st = ET_STATE_GLOBAL;
2372+
elementtreestate *st = self->state;
23732373
pi_factory = st->pi_factory;
23742374
}
23752375
if (pi_factory) {
@@ -3000,6 +3000,7 @@ typedef struct {
30003000

30013001
PyObject *handle_close;
30023002

3003+
elementtreestate *state;
30033004
} XMLParserObject;
30043005

30053006
/* helpers */
@@ -3143,7 +3144,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
31433144

31443145
value = PyDict_GetItemWithError(self->entity, key);
31453146

3146-
elementtreestate *st = ET_STATE_GLOBAL;
3147+
elementtreestate *st = self->state;
31473148
if (value) {
31483149
if (TreeBuilder_CheckExact(st, self->target))
31493150
res = treebuilder_handle_data(
@@ -3218,7 +3219,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
32183219
attrib = NULL;
32193220
}
32203221

3221-
elementtreestate *st = ET_STATE_GLOBAL;
3222+
elementtreestate *st = self->state;
32223223
if (TreeBuilder_CheckExact(st, self->target)) {
32233224
/* shortcut */
32243225
res = treebuilder_handle_start((TreeBuilderObject*) self->target,
@@ -3257,7 +3258,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
32573258
if (!data)
32583259
return; /* parser will look for errors */
32593260

3260-
elementtreestate *st = ET_STATE_GLOBAL;
3261+
elementtreestate *st = self->state;
32613262
if (TreeBuilder_CheckExact(st, self->target))
32623263
/* shortcut */
32633264
res = treebuilder_handle_data((TreeBuilderObject*) self->target, data);
@@ -3280,7 +3281,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
32803281
if (PyErr_Occurred())
32813282
return;
32823283

3283-
elementtreestate *st = ET_STATE_GLOBAL;
3284+
elementtreestate *st = self->state;
32843285
if (TreeBuilder_CheckExact(st, self->target))
32853286
/* shortcut */
32863287
/* the standard tree builder doesn't look at the end tag */
@@ -3315,7 +3316,7 @@ expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix_in,
33153316
if (!prefix_in)
33163317
prefix_in = "";
33173318

3318-
elementtreestate *st = ET_STATE_GLOBAL;
3319+
elementtreestate *st = self->state;
33193320
if (TreeBuilder_CheckExact(st, self->target)) {
33203321
/* shortcut - TreeBuilder does not actually implement .start_ns() */
33213322
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3366,7 +3367,7 @@ expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in)
33663367
if (!prefix_in)
33673368
prefix_in = "";
33683369

3369-
elementtreestate *st = ET_STATE_GLOBAL;
3370+
elementtreestate *st = self->state;
33703371
if (TreeBuilder_CheckExact(st, self->target)) {
33713372
/* shortcut - TreeBuilder does not actually implement .end_ns() */
33723373
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3395,7 +3396,7 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
33953396
if (PyErr_Occurred())
33963397
return;
33973398

3398-
elementtreestate *st = ET_STATE_GLOBAL;
3399+
elementtreestate *st = self->state;
33993400
if (TreeBuilder_CheckExact(st, self->target)) {
34003401
/* shortcut */
34013402
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3456,7 +3457,7 @@ expat_start_doctype_handler(XMLParserObject *self,
34563457
pubid_obj = Py_NewRef(Py_None);
34573458
}
34583459

3459-
elementtreestate *st = ET_STATE_GLOBAL;
3460+
elementtreestate *st = self->state;
34603461
/* If the target has a handler for doctype, call it. */
34613462
if (self->handle_doctype) {
34623463
res = PyObject_CallFunctionObjArgs(self->handle_doctype,
@@ -3489,7 +3490,7 @@ expat_pi_handler(XMLParserObject* self, const XML_Char* target_in,
34893490
if (PyErr_Occurred())
34903491
return;
34913492

3492-
elementtreestate *st = ET_STATE_GLOBAL;
3493+
elementtreestate *st = self->state;
34933494
if (TreeBuilder_CheckExact(st, self->target)) {
34943495
/* shortcut */
34953496
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
@@ -3542,6 +3543,7 @@ xmlparser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
35423543
self->handle_start = self->handle_data = self->handle_end = NULL;
35433544
self->handle_comment = self->handle_pi = self->handle_close = NULL;
35443545
self->handle_doctype = NULL;
3546+
self->state = ET_STATE_GLOBAL;
35453547
}
35463548
return (PyObject *)self;
35473549
}
@@ -3598,7 +3600,7 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target,
35983600
if (target != Py_None) {
35993601
Py_INCREF(target);
36003602
} else {
3601-
elementtreestate *st = ET_STATE_GLOBAL;
3603+
elementtreestate *st = self->state;
36023604
target = treebuilder_new(st->TreeBuilder_Type, NULL, NULL);
36033605
if (!target) {
36043606
Py_CLEAR(self->entity);
@@ -3768,7 +3770,7 @@ expat_parse(XMLParserObject* self, const char* data, int data_len, int final)
37683770
return NULL;
37693771

37703772
if (!ok) {
3771-
elementtreestate *st = ET_STATE_GLOBAL;
3773+
elementtreestate *st = self->state;
37723774
expat_set_error(
37733775
st,
37743776
EXPAT(GetErrorCode)(self->parser),
@@ -3802,7 +3804,7 @@ _elementtree_XMLParser_close_impl(XMLParserObject *self)
38023804
if (!res)
38033805
return NULL;
38043806

3805-
elementtreestate *st = ET_STATE_GLOBAL;
3807+
elementtreestate *st = self->state;
38063808
if (TreeBuilder_CheckExact(st, self->target)) {
38073809
Py_DECREF(res);
38083810
return treebuilder_done((TreeBuilderObject*) self->target);
@@ -3942,7 +3944,7 @@ _elementtree_XMLParser__parse_whole(XMLParserObject *self, PyObject *file)
39423944

39433945
res = expat_parse(self, "", 0, 1);
39443946

3945-
elementtreestate *st = ET_STATE_GLOBAL;
3947+
elementtreestate *st = self->state;
39463948
if (res && TreeBuilder_CheckExact(st, self->target)) {
39473949
Py_DECREF(res);
39483950
return treebuilder_done((TreeBuilderObject*) self->target);
@@ -3974,7 +3976,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
39743976
if (!_check_xmlparser(self)) {
39753977
return NULL;
39763978
}
3977-
elementtreestate *st = ET_STATE_GLOBAL;
3979+
elementtreestate *st = self->state;
39783980
if (!TreeBuilder_CheckExact(st, self->target)) {
39793981
PyErr_SetString(
39803982
PyExc_TypeError,

0 commit comments

Comments
 (0)