From: Meador Inge Date: Sat, 11 Aug 2012 03:05:45 +0000 (-0500) Subject: Issue #15424: Add a __sizeof__ implementation for array objects. X-Git-Tag: v2.7.4rc1~656 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2d639d5665739886e2044b2c92d2e157ee0161aa;p=thirdparty%2FPython%2Fcpython.git Issue #15424: Add a __sizeof__ implementation for array objects. Patch by Ludwig Hähne. --- diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index acf5b8f81a5f..74dccbf1120d 100755 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -985,6 +985,19 @@ class UnsignedNumberTest(NumberTest): upper = long(pow(2, a.itemsize * 8)) - 1L self.check_overflow(lower, upper) + @test_support.cpython_only + def test_sizeof_with_buffer(self): + a = array.array(self.typecode, self.example) + basesize = test_support.calcvobjsize('4P') + buffer_size = a.buffer_info()[1] * a.itemsize + test_support.check_sizeof(self, a, basesize + buffer_size) + + @test_support.cpython_only + def test_sizeof_without_buffer(self): + a = array.array(self.typecode) + basesize = test_support.calcvobjsize('4P') + test_support.check_sizeof(self, a, basesize) + class ByteTest(SignedNumberTest): typecode = 'b' diff --git a/Misc/ACKS b/Misc/ACKS index 56d576574349..1f098d437cc8 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -393,6 +393,7 @@ Jim Hugunin Greg Humphreys Eric Huss Jeremy Hylton +Ludwig Hähne Gerhard Häring Fredrik Håård Catalin Iacob diff --git a/Misc/NEWS b/Misc/NEWS index 91ad192e0d69..baece2edbf96 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -94,6 +94,9 @@ Library - Issue #15567: Fix NameError when running threading._test +- Issue #15424: Add a __sizeof__ implementation for array objects. + Patch by Ludwig Hähne. + - Issue #13052: Fix IDLE crashing when replace string in Search/Replace dialog ended with '\'. Patch by Roger Serwy. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index a860f57cef94..5a92862a7c30 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1532,6 +1532,19 @@ array_reduce(arrayobject *array) PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); +static PyObject * +array_sizeof(arrayobject *self, PyObject *unused) +{ + Py_ssize_t res; + res = sizeof(arrayobject) + self->allocated * self->ob_descr->itemsize; + return PyLong_FromSsize_t(res); +} + +PyDoc_STRVAR(sizeof_doc, +"__sizeof__() -> int\n\ +\n\ +Size of the array in memory, in bytes."); + static PyObject * array_get_typecode(arrayobject *a, void *closure) { @@ -1606,6 +1619,8 @@ static PyMethodDef array_methods[] = { #endif {"write", (PyCFunction)array_tofile_as_write, METH_O, tofile_doc}, + {"__sizeof__", (PyCFunction)array_sizeof, METH_NOARGS, + sizeof_doc}, {NULL, NULL} /* sentinel */ };