@@ -61,15 +61,22 @@ do { memory -= size; printf("%8d - %s\n", memory, comment); } while (0)
6161#define JOIN_SET (p , flag ) ((void*) ((uintptr_t) (JOIN_OBJ(p)) | (flag)))
6262#define JOIN_OBJ (p ) ((PyObject*) ((uintptr_t) (p) & ~(uintptr_t)1))
6363
64+ /* Py_SETREF for a PyObject* that uses a join flag. */
65+ Py_LOCAL_INLINE (void )
66+ _set_joined_ptr (PyObject * * p , PyObject * new_joined_ptr )
67+ {
68+ PyObject * tmp = JOIN_OBJ (* p );
69+ * p = new_joined_ptr ;
70+ Py_DECREF (tmp );
71+ }
72+
6473/* Py_CLEAR for a PyObject* that uses a join flag. Pass the pointer by
6574 * reference since this function sets it to NULL.
6675*/
6776static void _clear_joined_ptr (PyObject * * p )
6877{
6978 if (* p ) {
70- PyObject * tmp = JOIN_OBJ (* p );
71- * p = NULL ;
72- Py_DECREF (tmp );
79+ _set_joined_ptr (p , NULL );
7380 }
7481}
7582
@@ -356,7 +363,6 @@ static int
356363element_init (PyObject * self , PyObject * args , PyObject * kwds )
357364{
358365 PyObject * tag ;
359- PyObject * tmp ;
360366 PyObject * attrib = NULL ;
361367 ElementObject * self_elem ;
362368
@@ -397,15 +403,11 @@ element_init(PyObject *self, PyObject *args, PyObject *kwds)
397403 Py_INCREF (tag );
398404 Py_XSETREF (self_elem -> tag , tag );
399405
400- tmp = self_elem -> text ;
401406 Py_INCREF (Py_None );
402- self_elem -> text = Py_None ;
403- Py_DECREF (JOIN_OBJ (tmp ));
407+ _set_joined_ptr (& self_elem -> text , Py_None );
404408
405- tmp = self_elem -> tail ;
406409 Py_INCREF (Py_None );
407- self_elem -> tail = Py_None ;
408- Py_DECREF (JOIN_OBJ (tmp ));
410+ _set_joined_ptr (& self_elem -> tail , Py_None );
409411
410412 return 0 ;
411413}
@@ -675,12 +677,10 @@ _elementtree_Element_clear_impl(ElementObject *self)
675677 dealloc_extra (self );
676678
677679 Py_INCREF (Py_None );
678- Py_DECREF (JOIN_OBJ (self - > text ));
679- self - > text = Py_None ;
680+ _set_joined_ptr (& self - > text , Py_None );
680681
681682 Py_INCREF (Py_None );
682- Py_DECREF (JOIN_OBJ (self - > tail ));
683- self - > tail = Py_None ;
683+ _set_joined_ptr (& self - > tail , Py_None );
684684
685685 Py_RETURN_NONE ;
686686}
@@ -702,13 +702,11 @@ _elementtree_Element___copy___impl(ElementObject *self)
702702 if (!element )
703703 return NULL;
704704
705- Py_DECREF (JOIN_OBJ (element - > text ));
706- element - > text = self - > text ;
707- Py_INCREF (JOIN_OBJ (element - > text ));
705+ Py_INCREF (JOIN_OBJ (self - > text ));
706+ _set_joined_ptr (& element - > text , self - > text );
708707
709- Py_DECREF (JOIN_OBJ (element - > tail ));
710- element - > tail = self - > tail ;
711- Py_INCREF (JOIN_OBJ (element - > tail ));
708+ Py_INCREF (JOIN_OBJ (self -> tail ));
709+ _set_joined_ptr (& element -> tail , self -> tail );
712710
713711 if (self -> extra ) {
714712 if (element_resize (element , self -> extra -> length ) < 0 ) {
@@ -776,14 +774,12 @@ _elementtree_Element___deepcopy__(ElementObject *self, PyObject *memo)
776774 text = deepcopy (JOIN_OBJ (self -> text ), memo );
777775 if (!text )
778776 goto error ;
779- Py_DECREF (element -> text );
780- element -> text = JOIN_SET (text , JOIN_GET (self -> text ));
777+ _set_joined_ptr (& element -> text , JOIN_SET (text , JOIN_GET (self -> text )));
781778
782779 tail = deepcopy (JOIN_OBJ (self -> tail ), memo );
783780 if (!tail )
784781 goto error ;
785- Py_DECREF (element -> tail );
786- element -> tail = JOIN_SET (tail , JOIN_GET (self -> tail ));
782+ _set_joined_ptr (& element -> tail , JOIN_SET (tail , JOIN_GET (self -> tail )));
787783
788784 if (self -> extra ) {
789785 if (element_resize (element , self -> extra -> length ) < 0 )
@@ -967,13 +963,13 @@ element_setstate_from_attributes(ElementObject *self,
967963 Py_INCREF (tag );
968964 Py_XSETREF (self -> tag , tag );
969965
970- _clear_joined_ptr ( & self -> text ) ;
971- self -> text = text ? JOIN_SET ( text , PyList_CheckExact (text )) : Py_None ;
972- Py_INCREF ( JOIN_OBJ ( self -> text ) );
966+ text = text ? JOIN_SET ( text , PyList_CheckExact ( text )) : Py_None ;
967+ Py_INCREF ( JOIN_OBJ (text ));
968+ _set_joined_ptr ( & self -> text , text );
973969
974- _clear_joined_ptr ( & self -> tail ) ;
975- self -> tail = tail ? JOIN_SET ( tail , PyList_CheckExact (tail )) : Py_None ;
976- Py_INCREF ( JOIN_OBJ ( self -> tail ) );
970+ tail = tail ? JOIN_SET ( tail , PyList_CheckExact ( tail )) : Py_None ;
971+ Py_INCREF ( JOIN_OBJ (tail ));
972+ _set_joined_ptr ( & self -> tail , tail );
977973
978974 /* Handle ATTRIB and CHILDREN. */
979975 if (!children && !attrib )
@@ -1980,8 +1976,7 @@ element_text_setter(ElementObject *self, PyObject *value, void *closure)
19801976{
19811977 _VALIDATE_ATTR_VALUE (value );
19821978 Py_INCREF (value );
1983- Py_DECREF (JOIN_OBJ (self -> text ));
1984- self -> text = value ;
1979+ _set_joined_ptr (& self -> text , value );
19851980 return 0 ;
19861981}
19871982
@@ -1990,8 +1985,7 @@ element_tail_setter(ElementObject *self, PyObject *value, void *closure)
19901985{
19911986 _VALIDATE_ATTR_VALUE (value );
19921987 Py_INCREF (value );
1993- Py_DECREF (JOIN_OBJ (self -> tail ));
1994- self -> tail = value ;
1988+ _set_joined_ptr (& self -> tail , value );
19951989 return 0 ;
19961990}
19971991
0 commit comments