@@ -2306,6 +2306,7 @@ typedef struct {
2306
2306
2307
2307
char insert_comments ;
2308
2308
char insert_pis ;
2309
+ elementtreestate * state ;
2309
2310
} TreeBuilderObject ;
2310
2311
2311
2312
#define TreeBuilder_CheckExact (st , op ) Py_IS_TYPE((op), (st)->TreeBuilder_Type)
@@ -2339,6 +2340,7 @@ treebuilder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2339
2340
t -> start_ns_event_obj = t -> end_ns_event_obj = NULL ;
2340
2341
t -> comment_event_obj = t -> pi_event_obj = NULL ;
2341
2342
t -> insert_comments = t -> insert_pis = 0 ;
2343
+ t -> state = ET_STATE_GLOBAL ;
2342
2344
}
2343
2345
return (PyObject * )t ;
2344
2346
}
@@ -2370,7 +2372,7 @@ _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self,
2370
2372
}
2371
2373
2372
2374
if (comment_factory == Py_None ) {
2373
- elementtreestate * st = ET_STATE_GLOBAL ;
2375
+ elementtreestate * st = self -> state ;
2374
2376
comment_factory = st -> comment_factory ;
2375
2377
}
2376
2378
if (comment_factory ) {
@@ -2382,7 +2384,7 @@ _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self,
2382
2384
}
2383
2385
2384
2386
if (pi_factory == Py_None ) {
2385
- elementtreestate * st = ET_STATE_GLOBAL ;
2387
+ elementtreestate * st = self -> state ;
2386
2388
pi_factory = st -> pi_factory ;
2387
2389
}
2388
2390
if (pi_factory ) {
@@ -2564,7 +2566,7 @@ treebuilder_flush_data(TreeBuilderObject* self)
2564
2566
if (!self -> data ) {
2565
2567
return 0 ;
2566
2568
}
2567
- elementtreestate * st = ET_STATE_GLOBAL ;
2569
+ elementtreestate * st = self -> state ;
2568
2570
if (!self -> last_for_tail ) {
2569
2571
PyObject * element = self -> last ;
2570
2572
return treebuilder_extend_element_text_or_tail (
@@ -2624,7 +2626,7 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
2624
2626
{
2625
2627
PyObject * node ;
2626
2628
PyObject * this ;
2627
- elementtreestate * st = ET_STATE_GLOBAL ;
2629
+ elementtreestate * st = self -> state ;
2628
2630
2629
2631
if (treebuilder_flush_data (self ) < 0 ) {
2630
2632
return NULL ;
@@ -3013,6 +3015,7 @@ typedef struct {
3013
3015
3014
3016
PyObject * handle_close ;
3015
3017
3018
+ elementtreestate * state ;
3016
3019
} XMLParserObject ;
3017
3020
3018
3021
/* helpers */
@@ -3158,7 +3161,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
3158
3161
value = PyDict_GetItemWithError (self -> entity , key );
3159
3162
3160
3163
if (value ) {
3161
- elementtreestate * st = ET_STATE_GLOBAL ;
3164
+ elementtreestate * st = self -> state ;
3162
3165
if (TreeBuilder_CheckExact (st , self -> target ))
3163
3166
res = treebuilder_handle_data (
3164
3167
(TreeBuilderObject * ) self -> target , value
@@ -3231,7 +3234,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
3231
3234
attrib = NULL ;
3232
3235
}
3233
3236
3234
- elementtreestate * st = ET_STATE_GLOBAL ;
3237
+ elementtreestate * st = self -> state ;
3235
3238
if (TreeBuilder_CheckExact (st , self -> target )) {
3236
3239
/* shortcut */
3237
3240
res = treebuilder_handle_start ((TreeBuilderObject * ) self -> target ,
@@ -3270,7 +3273,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
3270
3273
if (!data )
3271
3274
return ; /* parser will look for errors */
3272
3275
3273
- elementtreestate * st = ET_STATE_GLOBAL ;
3276
+ elementtreestate * st = self -> state ;
3274
3277
if (TreeBuilder_CheckExact (st , self -> target ))
3275
3278
/* shortcut */
3276
3279
res = treebuilder_handle_data ((TreeBuilderObject * ) self -> target , data );
@@ -3293,7 +3296,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
3293
3296
if (PyErr_Occurred ())
3294
3297
return ;
3295
3298
3296
- elementtreestate * st = ET_STATE_GLOBAL ;
3299
+ elementtreestate * st = self -> state ;
3297
3300
if (TreeBuilder_CheckExact (st , self -> target ))
3298
3301
/* shortcut */
3299
3302
/* 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,
3328
3331
if (!prefix_in )
3329
3332
prefix_in = "" ;
3330
3333
3331
- elementtreestate * st = ET_STATE_GLOBAL ;
3334
+ elementtreestate * st = self -> state ;
3332
3335
if (TreeBuilder_CheckExact (st , self -> target )) {
3333
3336
/* shortcut - TreeBuilder does not actually implement .start_ns() */
3334
3337
TreeBuilderObject * target = (TreeBuilderObject * ) self -> target ;
@@ -3379,7 +3382,7 @@ expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in)
3379
3382
if (!prefix_in )
3380
3383
prefix_in = "" ;
3381
3384
3382
- elementtreestate * st = ET_STATE_GLOBAL ;
3385
+ elementtreestate * st = self -> state ;
3383
3386
if (TreeBuilder_CheckExact (st , self -> target )) {
3384
3387
/* shortcut - TreeBuilder does not actually implement .end_ns() */
3385
3388
TreeBuilderObject * target = (TreeBuilderObject * ) self -> target ;
@@ -3408,7 +3411,7 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
3408
3411
if (PyErr_Occurred ())
3409
3412
return ;
3410
3413
3411
- elementtreestate * st = ET_STATE_GLOBAL ;
3414
+ elementtreestate * st = self -> state ;
3412
3415
if (TreeBuilder_CheckExact (st , self -> target )) {
3413
3416
/* shortcut */
3414
3417
TreeBuilderObject * target = (TreeBuilderObject * ) self -> target ;
@@ -3469,7 +3472,7 @@ expat_start_doctype_handler(XMLParserObject *self,
3469
3472
pubid_obj = Py_NewRef (Py_None );
3470
3473
}
3471
3474
3472
- elementtreestate * st = ET_STATE_GLOBAL ;
3475
+ elementtreestate * st = self -> state ;
3473
3476
/* If the target has a handler for doctype, call it. */
3474
3477
if (self -> handle_doctype ) {
3475
3478
res = PyObject_CallFunctionObjArgs (self -> handle_doctype ,
@@ -3502,7 +3505,7 @@ expat_pi_handler(XMLParserObject* self, const XML_Char* target_in,
3502
3505
if (PyErr_Occurred ())
3503
3506
return ;
3504
3507
3505
- elementtreestate * st = ET_STATE_GLOBAL ;
3508
+ elementtreestate * st = self -> state ;
3506
3509
if (TreeBuilder_CheckExact (st , self -> target )) {
3507
3510
/* shortcut */
3508
3511
TreeBuilderObject * target = (TreeBuilderObject * ) self -> target ;
@@ -3555,6 +3558,7 @@ xmlparser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3555
3558
self -> handle_start = self -> handle_data = self -> handle_end = NULL ;
3556
3559
self -> handle_comment = self -> handle_pi = self -> handle_close = NULL ;
3557
3560
self -> handle_doctype = NULL ;
3561
+ self -> state = ET_STATE_GLOBAL ;
3558
3562
}
3559
3563
return (PyObject * )self ;
3560
3564
}
@@ -3611,7 +3615,7 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target,
3611
3615
if (target != Py_None ) {
3612
3616
Py_INCREF (target );
3613
3617
} else {
3614
- elementtreestate * st = ET_STATE_GLOBAL ;
3618
+ elementtreestate * st = self -> state ;
3615
3619
target = treebuilder_new (st -> TreeBuilder_Type , NULL , NULL );
3616
3620
if (!target ) {
3617
3621
Py_CLEAR (self -> entity );
@@ -3813,7 +3817,7 @@ _elementtree_XMLParser_close_impl(XMLParserObject *self)
3813
3817
if (!res )
3814
3818
return NULL ;
3815
3819
3816
- elementtreestate * st = ET_STATE_GLOBAL ;
3820
+ elementtreestate * st = self -> state ;
3817
3821
if (TreeBuilder_CheckExact (st , self -> target )) {
3818
3822
Py_DECREF (res );
3819
3823
return treebuilder_done ((TreeBuilderObject * ) self -> target );
@@ -3953,7 +3957,7 @@ _elementtree_XMLParser__parse_whole(XMLParserObject *self, PyObject *file)
3953
3957
3954
3958
res = expat_parse (self , "" , 0 , 1 );
3955
3959
3956
- elementtreestate * st = ET_STATE_GLOBAL ;
3960
+ elementtreestate * st = self -> state ;
3957
3961
if (res && TreeBuilder_CheckExact (st , self -> target )) {
3958
3962
Py_DECREF (res );
3959
3963
return treebuilder_done ((TreeBuilderObject * ) self -> target );
@@ -3985,7 +3989,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
3985
3989
if (!_check_xmlparser (self )) {
3986
3990
return NULL ;
3987
3991
}
3988
- elementtreestate * st = ET_STATE_GLOBAL ;
3992
+ elementtreestate * st = self -> state ;
3989
3993
if (!TreeBuilder_CheckExact (st , self -> target )) {
3990
3994
PyErr_SetString (
3991
3995
PyExc_TypeError ,
0 commit comments