From 2d639d5665739886e2044b2c92d2e157ee0161aa Mon Sep 17 00:00:00 2001 From: Meador Inge Date: Fri, 10 Aug 2012 22:05:45 -0500 Subject: Issue #15424: Add a __sizeof__ implementation for array objects. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch by Ludwig Hähne. --- Lib/test/test_array.py | 13 +++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/arraymodule.c | 15 +++++++++++++++ 4 files changed, 32 insertions(+) diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index acf5b8f..74dccbf 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 56d5765..1f098d4 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 91ad192..baece2e 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 a860f57..5a92862 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1533,6 +1533,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) { char tc = a->ob_descr->typecode; @@ -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 */ }; -- cgit v0.12