@@ -229,9 +229,6 @@ typedef struct {
229229    PyObject *  * children ;
230230
231231    PyObject *  _children [STATIC_CHILDREN ];
232- 
233-     /* incremented whenever the object is externally mutated */ 
234-     size_t  version ;
235232} ElementObjectExtra ;
236233
237234typedef  struct  {
@@ -281,8 +278,6 @@ create_extra(ElementObject* self, PyObject* attrib)
281278    self -> extra -> allocated  =  STATIC_CHILDREN ;
282279    self -> extra -> children  =  self -> extra -> _children ;
283280
284-     self -> extra -> version  =  0 ;
285- 
286281    return  0 ;
287282}
288283
@@ -510,7 +505,6 @@ element_resize(ElementObject* self, Py_ssize_t extra)
510505        }
511506        self -> extra -> children  =  children ;
512507        self -> extra -> allocated  =  size ;
513-         self -> extra -> version ++ ;
514508    }
515509
516510    return  0 ;
@@ -544,7 +538,6 @@ element_add_subelement(elementtreestate *st, ElementObject *self,
544538    self -> extra -> children [self -> extra -> length ] =  Py_NewRef (element );
545539
546540    self -> extra -> length ++ ;
547-     self -> extra -> version ++ ;
548541
549542    return  0 ;
550543}
@@ -786,7 +779,6 @@ _elementtree_Element___copy___impl(ElementObject *self, PyTypeObject *cls)
786779
787780        assert (!element -> extra -> length );
788781        element -> extra -> length  =  self -> extra -> length ;
789-         element -> extra -> version  =  self -> extra -> version ;
790782    }
791783
792784    return  (PyObject * ) element ;
@@ -870,7 +862,6 @@ _elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo)
870862
871863        assert (!element -> extra -> length );
872864        element -> extra -> length  =  self -> extra -> length ;
873-         element -> extra -> version  =  0 ;
874865    }
875866
876867    /* add object to memo dictionary (so deepcopy won't visit it again) */ 
@@ -1557,7 +1548,6 @@ _elementtree_Element_insert_impl(ElementObject *self, Py_ssize_t index,
15571548    self -> extra -> children [index ] =  Py_NewRef (subelement );
15581549
15591550    self -> extra -> length ++ ;
1560-     self -> extra -> version ++ ;
15611551
15621552    Py_RETURN_NONE ;
15631553}
@@ -1648,17 +1638,17 @@ _elementtree_Element_remove_impl(ElementObject *self, PyObject *subelement)
16481638    }
16491639
16501640    Py_ssize_t  i ;
1651-     size_t   old_version   =  self -> extra -> version ;
1641+     const   Py_ssize_t   length   =  self -> extra -> length ;
16521642    for  (i  =  0 ; self -> extra  &&  i  <  self -> extra -> length ; i ++ ) {
1653-         if  (old_version  !=  self -> extra -> version ) {
1654-             goto fail ;
1655-         }
1656-         else  if  (self -> extra -> children [i ] ==  subelement ) {
1643+         if  (self -> extra -> children [i ] ==  subelement ) {
16571644            break ;
16581645        }
16591646        PyObject  * child  =  Py_NewRef (self -> extra -> children [i ]);
16601647        int  rc  =  PyObject_RichCompareBool (child , subelement , Py_EQ );
16611648        Py_DECREF (child );
1649+         if  (self -> extra  ==   NULL  ||  self -> extra -> length  !=  length ) {
1650+             goto fail ;
1651+         }
16621652        if  (rc  >  0 ) {
16631653            break ;
16641654        }
@@ -1667,8 +1657,10 @@ _elementtree_Element_remove_impl(ElementObject *self, PyObject *subelement)
16671657        }
16681658    }
16691659
1670-     // An extra check must be done if the mutation occurs at the very last step. 
1671-     if  (self -> extra  ==  NULL  ||  old_version  !=  self -> extra -> version ) {
1660+     // An extra check must be done if the mutation occurs at the very last 
1661+     // step and removes or clears the 'extra' list (the condition on the 
1662+     // length would not be satisfied any more). 
1663+     if  (self -> extra  ==  NULL  ||  self -> extra -> length  !=  length ) {
16721664        goto fail ;
16731665    }
16741666    else  if  (i  >= self -> extra -> length ) {
@@ -1682,7 +1674,6 @@ _elementtree_Element_remove_impl(ElementObject *self, PyObject *subelement)
16821674    for  (; i  <  self -> extra -> length ; i ++ ) {
16831675        self -> extra -> children [i ] =  self -> extra -> children [i + 1 ];
16841676    }
1685-     self -> extra -> version ++ ;
16861677
16871678    Py_DECREF (found );
16881679    Py_RETURN_NONE ;
@@ -1746,7 +1737,6 @@ _elementtree_Element_set_impl(ElementObject *self, PyObject *key,
17461737    if  (PyDict_SetItem (attrib , key , value ) <  0 )
17471738        return  NULL ;
17481739
1749-     self -> extra -> version ++ ;
17501740    Py_RETURN_NONE ;
17511741}
17521742
@@ -1780,7 +1770,6 @@ element_setitem(PyObject* self_, Py_ssize_t index, PyObject* item)
17801770            self -> extra -> children [i ] =  self -> extra -> children [i + 1 ];
17811771    }
17821772
1783-     self -> extra -> version ++ ;
17841773    Py_DECREF (old );
17851774
17861775    return  0 ;
@@ -1931,7 +1920,6 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
19311920            }
19321921
19331922            self -> extra -> length  -=  slicelen ;
1934-             self -> extra -> version ++ ;
19351923
19361924            /* Discard the recycle list with all the deleted sub-elements */ 
19371925            Py_DECREF (recycle );
@@ -2007,7 +1995,6 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
20071995        }
20081996
20091997        self -> extra -> length  +=  newlen  -  slicelen ;
2010-         self -> extra -> version ++ ;
20111998
20121999        Py_DECREF (seq );
20132000
@@ -2104,7 +2091,6 @@ element_attrib_setter(ElementObject *self, PyObject *value, void *closure)
21042091            return  -1 ;
21052092    }
21062093    Py_XSETREF (self -> extra -> attrib , Py_NewRef (value ));
2107-     self -> extra -> version ++ ;
21082094    return  0 ;
21092095}
21102096
0 commit comments