@@ -2448,6 +2448,23 @@ treebuilder_add_subelement(PyObject *element, PyObject *child)
24482448 }
24492449}
24502450
2451+ LOCAL (int )
2452+ treebuilder_append_event (TreeBuilderObject * self , PyObject * action ,
2453+ PyObject * node )
2454+ {
2455+ if (action != NULL ) {
2456+ PyObject * res = PyTuple_Pack (2 , action , node );
2457+ if (res == NULL )
2458+ return -1 ;
2459+ if (PyList_Append (self -> events , res ) < 0 ) {
2460+ Py_DECREF (res );
2461+ return -1 ;
2462+ }
2463+ Py_DECREF (res );
2464+ }
2465+ return 0 ;
2466+ }
2467+
24512468/* -------------------------------------------------------------------- */
24522469/* handlers */
24532470
@@ -2515,16 +2532,8 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
25152532 Py_INCREF (node );
25162533 self -> last = node ;
25172534
2518- if (self -> start_event_obj ) {
2519- PyObject * res ;
2520- PyObject * action = self -> start_event_obj ;
2521- res = PyTuple_Pack (2 , action , node );
2522- if (res ) {
2523- PyList_Append (self -> events , res );
2524- Py_DECREF (res );
2525- } else
2526- PyErr_Clear (); /* FIXME: propagate error */
2527- }
2535+ if (treebuilder_append_event (self , self -> start_event_obj , node ) < 0 )
2536+ goto error ;
25282537
25292538 return node ;
25302539
@@ -2604,65 +2613,13 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag)
26042613 self -> last = self -> this ;
26052614 self -> this = item ;
26062615
2607- if (self -> end_event_obj ) {
2608- PyObject * res ;
2609- PyObject * action = self -> end_event_obj ;
2610- PyObject * node = (PyObject * ) self -> last ;
2611- res = PyTuple_Pack (2 , action , node );
2612- if (res ) {
2613- PyList_Append (self -> events , res );
2614- Py_DECREF (res );
2615- } else
2616- PyErr_Clear (); /* FIXME: propagate error */
2617- }
2616+ if (treebuilder_append_event (self , self -> end_event_obj , self -> last ) < 0 )
2617+ return NULL ;
26182618
26192619 Py_INCREF (self -> last );
26202620 return (PyObject * ) self -> last ;
26212621}
26222622
2623- LOCAL (void )
2624- treebuilder_handle_namespace (TreeBuilderObject * self , int start ,
2625- PyObject * prefix , PyObject * uri )
2626- {
2627- PyObject * res ;
2628- PyObject * action ;
2629- PyObject * parcel ;
2630-
2631- if (!self -> events )
2632- return ;
2633-
2634- if (start ) {
2635- if (!self -> start_ns_event_obj )
2636- return ;
2637- action = self -> start_ns_event_obj ;
2638- parcel = Py_BuildValue ("OO" , prefix , uri );
2639- if (!parcel )
2640- return ;
2641- Py_INCREF (action );
2642- } else {
2643- if (!self -> end_ns_event_obj )
2644- return ;
2645- action = self -> end_ns_event_obj ;
2646- Py_INCREF (action );
2647- parcel = Py_None ;
2648- Py_INCREF (parcel );
2649- }
2650-
2651- res = PyTuple_New (2 );
2652-
2653- if (res ) {
2654- PyTuple_SET_ITEM (res , 0 , action );
2655- PyTuple_SET_ITEM (res , 1 , parcel );
2656- PyList_Append (self -> events , res );
2657- Py_DECREF (res );
2658- }
2659- else {
2660- Py_DECREF (action );
2661- Py_DECREF (parcel );
2662- PyErr_Clear (); /* FIXME: propagate error */
2663- }
2664- }
2665-
26662623/* -------------------------------------------------------------------- */
26672624/* methods (in alphabetical order) */
26682625
@@ -3100,45 +3057,39 @@ static void
31003057expat_start_ns_handler (XMLParserObject * self , const XML_Char * prefix ,
31013058 const XML_Char * uri )
31023059{
3103- PyObject * sprefix = NULL ;
3104- PyObject * suri = NULL ;
3060+ TreeBuilderObject * target = ( TreeBuilderObject * ) self -> target ;
3061+ PyObject * parcel ;
31053062
31063063 if (PyErr_Occurred ())
31073064 return ;
31083065
3109- if (uri )
3110- suri = PyUnicode_DecodeUTF8 (uri , strlen (uri ), "strict" );
3111- else
3112- suri = PyUnicode_FromString ("" );
3113- if (!suri )
3114- return ;
3115-
3116- if (prefix )
3117- sprefix = PyUnicode_DecodeUTF8 (prefix , strlen (prefix ), "strict" );
3118- else
3119- sprefix = PyUnicode_FromString ("" );
3120- if (!sprefix ) {
3121- Py_DECREF (suri );
3066+ if (!target -> events || !target -> start_ns_event_obj )
31223067 return ;
3123- }
31243068
3125- treebuilder_handle_namespace (
3126- (TreeBuilderObject * ) self -> target , 1 , sprefix , suri
3127- );
3069+ if (!uri )
3070+ uri = "" ;
3071+ if (!prefix )
3072+ prefix = "" ;
31283073
3129- Py_DECREF (sprefix );
3130- Py_DECREF (suri );
3074+ parcel = Py_BuildValue ("ss" , prefix , uri );
3075+ if (!parcel )
3076+ return ;
3077+ treebuilder_append_event (target , target -> start_ns_event_obj , parcel );
3078+ Py_DECREF (parcel );
31313079}
31323080
31333081static void
31343082expat_end_ns_handler (XMLParserObject * self , const XML_Char * prefix_in )
31353083{
3084+ TreeBuilderObject * target = (TreeBuilderObject * ) self -> target ;
3085+
31363086 if (PyErr_Occurred ())
31373087 return ;
31383088
3139- treebuilder_handle_namespace (
3140- (TreeBuilderObject * ) self -> target , 0 , NULL , NULL
3141- );
3089+ if (!target -> events )
3090+ return ;
3091+
3092+ treebuilder_append_event (target , target -> end_ns_event_obj , Py_None );
31423093}
31433094
31443095static void
0 commit comments