[Python-Dev] [Python-checkins] cpython: Issue #14065: Added cyclic GC support to ET.Element

Benjamin Peterson benjamin at python.org
Fri Mar 30 21:30:59 CEST 2012


2012/3/30 eli.bendersky <python-checkins at python.org>:
> http://hg.python.org/cpython/rev/0ca32013d77e
> changeset:   75997:0ca32013d77e
> parent:      75995:cf2e74e0b7d4
> user:        Eli Bendersky <eliben at gmail.com>
> date:        Fri Mar 30 16:38:33 2012 +0300
> summary:
>  Issue #14065: Added cyclic GC support to ET.Element
>
> files:
>  Lib/test/test_xml_etree.py |  27 ++++++++++-
>  Modules/_elementtree.c     |  63 +++++++++++++++++++------
>  2 files changed, 74 insertions(+), 16 deletions(-)
>
>
> diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
> --- a/Lib/test/test_xml_etree.py
> +++ b/Lib/test/test_xml_etree.py
> @@ -14,9 +14,10 @@
>  # Don't re-import "xml.etree.ElementTree" module in the docstring,
>  # except if the test is specific to the Python implementation.
>
> -import sys
> +import gc
>  import html
>  import io
> +import sys
>  import unittest
>
>  from test import support
> @@ -1846,6 +1847,30 @@
>         self.assertRaises(TypeError, e.extend, [ET.Element('bar'), 'foo'])
>         self.assertRaises(TypeError, e.insert, 0, 'foo')
>
> +    def test_cyclic_gc(self):
> +        class ShowGC:
> +            def __init__(self, flaglist):
> +                self.flaglist = flaglist
> +            def __del__(self):
> +                self.flaglist.append(1)

I think a nicer way to check for cyclic collection is to take a
weakref to an object, call the GC, then check to make sure the weakref
is broken.

> +
> +        # Test the shortest cycle: lst->element->lst
> +        fl = []
> +        lst = [ShowGC(fl)]
> +        lst.append(ET.Element('joe', attr=lst))
> +        del lst
> +        gc.collect()

support.gc_collect() is preferable

> +        self.assertEqual(fl, [1])
> +
> +        # A longer cycle: lst->e->e2->lst
> +        fl = []
> +        e = ET.Element('joe')
> +        lst = [ShowGC(fl), e]
> +        e2 = ET.SubElement(e, 'foo', attr=lst)
> +        del lst, e, e2
> +        gc.collect()
> +        self.assertEqual(fl, [1])


-- 
Regards,
Benjamin


More information about the Python-Dev mailing list