From: Serhiy Storchaka Date: Wed, 28 Dec 2016 07:23:17 +0000 (+0200) Subject: Backed out changeset 78bf34b6a713 X-Git-Tag: v2.7.14rc1~316 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1451874e6be94ff1f0b68d84b466da4a16bddaf2;p=python Backed out changeset 78bf34b6a713 --- diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py index 8d9bd17a19..98410c55a6 100644 --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -17,7 +17,6 @@ def sanity(): """ -@unittest.skipUnless(cET, 'requires _elementtree') class MiscTests(unittest.TestCase): # Issue #8651. @precisionbigmemtest(size=_2G + 100, memuse=1) @@ -63,22 +62,12 @@ class MiscTests(unittest.TestCase): del element.attrib self.assertEqual(element.attrib, {'A': 'B', 'C': 'D'}) - def test_trashcan(self): - # If this test fails, it will most likely die via segfault. - e = root = cET.Element('root') - for i in range(200000): - e = cET.SubElement(e, 'x') - del e - del root - test_support.gc_collect() - def test_main(): from test import test_xml_etree, test_xml_etree_c # Run the tests specific to the C implementation test_support.run_doctest(test_xml_etree_c, verbosity=True) - test_support.run_unittest(MiscTests) # Assign the C implementation before running the doctests # Patch the __name__, to prevent confusion with the pure Python test diff --git a/Misc/NEWS b/Misc/NEWS index 57e4838e4b..8b9ef48613 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -26,8 +26,6 @@ Library - Issue #29019: Fix dict.fromkeys(x) overallocates when x is sparce dict. Original patch by Rasmus Villemoes. -- Issue #28871: Fixed a crash when deallocate deep ElementTree. - - Issue #19542: Fix bugs in WeakValueDictionary.setdefault() and WeakValueDictionary.pop() when a GC collection happens in another thread. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 8e5b587703..b01167b8a0 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -121,18 +121,6 @@ typedef int Py_ssize_t; #define JOIN_SET(p, flag) ((void*) ((Py_uintptr_t) (JOIN_OBJ(p)) | (flag))) #define JOIN_OBJ(p) ((PyObject*) ((Py_uintptr_t) (p) & ~1)) -/* Py_CLEAR for a PyObject* that uses a join flag. Pass the pointer by - * reference since this function sets it to NULL. -*/ -static void _clear_joined_ptr(PyObject **p) -{ - if (*p) { - PyObject *tmp = JOIN_OBJ(*p); - *p = NULL; - Py_DECREF(tmp); - } -} - /* glue functions (see the init function for details) */ static PyObject* elementtree_parseerror_obj; static PyObject* elementtree_copyelement_obj; @@ -550,20 +538,17 @@ subelement(PyObject* self, PyObject* args, PyObject* kw) static void element_dealloc(ElementObject* self) { - Py_TRASHCAN_SAFE_BEGIN(self) + if (self->extra) + element_dealloc_extra(self); /* discard attributes */ Py_DECREF(self->tag); - _clear_joined_ptr(&self->text); - _clear_joined_ptr(&self->tail); - - if (self->extra) - element_dealloc_extra(self); + Py_DECREF(JOIN_OBJ(self->text)); + Py_DECREF(JOIN_OBJ(self->tail)); RELEASE(sizeof(ElementObject), "destroy element"); PyObject_Del(self); - Py_TRASHCAN_SAFE_END(self) } /* -------------------------------------------------------------------- */