[Python-checkins] cpython: Issue #14055: Add __sizeof__ support to _elementtree.
martin.v.loewis
python-checkins at python.org
Sun Jun 17 10:42:08 CEST 2012
http://hg.python.org/cpython/rev/093dec81ea1f
changeset: 77485:093dec81ea1f
user: Martin v. Löwis <martin at v.loewis.de>
date: Sun Jun 17 10:41:22 2012 +0200
summary:
Issue #14055: Add __sizeof__ support to _elementtree.
files:
Lib/test/test_xml_etree_c.py | 39 ++++++++++++++++++++++-
Misc/NEWS | 2 +
Modules/_elementtree.c | 14 ++++++++
3 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py
--- a/Lib/test/test_xml_etree_c.py
+++ b/Lib/test/test_xml_etree_c.py
@@ -1,5 +1,5 @@
# xml.etree test for cElementTree
-
+import sys, struct
from test import support
from test.support import import_fresh_module
import unittest
@@ -40,6 +40,40 @@
self.assertEqual(cET_alias.SubElement.__module__, '_elementtree')
+ at unittest.skipUnless(cET, 'requires _elementtree')
+class SizeofTest(unittest.TestCase):
+ def setUp(self):
+ import _testcapi
+ gc_headsize = _testcapi.SIZEOF_PYGC_HEAD
+ # object header
+ header = 'PP'
+ if hasattr(sys, "gettotalrefcount"):
+ # debug header
+ header = 'PP' + header
+ # fields
+ element = header + '5P'
+ self.elementsize = gc_headsize + struct.calcsize(element)
+ # extra
+ self.extra = struct.calcsize('PiiP4P')
+
+ def test_element(self):
+ e = cET.Element('a')
+ self.assertEqual(sys.getsizeof(e), self.elementsize)
+
+ def test_element_with_attrib(self):
+ e = cET.Element('a', href='about:')
+ self.assertEqual(sys.getsizeof(e),
+ self.elementsize + self.extra)
+
+ def test_element_with_children(self):
+ e = cET.Element('a')
+ for i in range(5):
+ cET.SubElement(e, 'span')
+ # should have space for 8 children now
+ self.assertEqual(sys.getsizeof(e),
+ self.elementsize + self.extra +
+ struct.calcsize('8P'))
+
def test_main():
from test import test_xml_etree, test_xml_etree_c
@@ -47,7 +81,8 @@
support.run_unittest(
MiscTests,
TestAliasWorking,
- TestAcceleratorImported
+ TestAcceleratorImported,
+ SizeofTest,
)
# Run the same test suite as the Python module
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -29,6 +29,8 @@
Library
-------
+- Issue #14055: Add __sizeof__ support to _elementtree.
+
- Issue #15054: A bug in tokenize.tokenize that caused string literals
with 'b' prefixes to be incorrectly tokenized has been fixed.
Patch by Serhiy Storchaka.
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -842,6 +842,19 @@
return NULL;
}
+static PyObject*
+element_sizeof(PyObject* _self, PyObject* args)
+{
+ ElementObject *self = (ElementObject*)_self;
+ Py_ssize_t result = sizeof(ElementObject);
+ if (self->extra) {
+ result += sizeof(ElementObjectExtra);
+ if (self->extra->children != self->extra->_children)
+ result += sizeof(PyObject*) * self->extra->allocated;
+ }
+ return PyLong_FromSsize_t(result);
+}
+
LOCAL(int)
checkpath(PyObject* tag)
{
@@ -1609,6 +1622,7 @@
{"__copy__", (PyCFunction) element_copy, METH_VARARGS},
{"__deepcopy__", (PyCFunction) element_deepcopy, METH_VARARGS},
+ {"__sizeof__", element_sizeof, METH_NOARGS},
{NULL, NULL}
};
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list