From 3bbd2fad4d4a282c7a5a3169a4f497b97aeff319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Thu, 26 Jul 2012 22:23:23 +0200 Subject: Issue #15456: Fix code __sizeof__ after #12399 change. Patch by Serhiy Storchaka. --- Lib/test/test_sys.py | 6 ++++++ Misc/NEWS | 3 +++ Objects/codeobject.c | 18 +++++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 9a6dd5b..b04df14 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -702,6 +702,12 @@ class SizeofTest(unittest.TestCase): check(get_cell().__closure__[0], size(h + 'P')) # code check(get_cell().__code__, size(h + '5i9Pi3P')) + check(get_cell.__code__, size(h + '5i9Pi3P')) + def get_cell2(x): + def inner(): + return x + return inner + check(get_cell2.__code__, size(h + '5i9Pi3P') + 1) # complex check(complex(0,1), size(h + '2d')) # method_descriptor (descriptor object) diff --git a/Misc/NEWS b/Misc/NEWS index 8d469ac..508ec1b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.3.0 Beta 2? Core and Builtins ----------------- +- Issue #15456: Fix code __sizeof__ after #12399 change. + Patch by Serhiy Storchaka. + - Issue #15404: Refleak in PyMethodObject repr. - Issue #15394: An issue in PyModule_Create that caused references to diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 550e284..9713f61 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -375,6 +375,17 @@ code_dealloc(PyCodeObject *co) } static PyObject * +code_sizeof(PyCodeObject *co, void *unused) +{ + Py_ssize_t res; + + res = sizeof(PyCodeObject); + if (co->co_cell2arg != NULL && co->co_cellvars != NULL) + res += PyTuple_GET_SIZE(co->co_cellvars) * sizeof(unsigned char); + return PyLong_FromSsize_t(res); +} + +static PyObject * code_repr(PyCodeObject *co) { int lineno; @@ -480,6 +491,11 @@ code_hash(PyCodeObject *co) /* XXX code objects need to participate in GC? */ +static struct PyMethodDef code_methods[] = { + {"__sizeof__", (PyCFunction)code_sizeof, METH_NOARGS}, + {NULL, NULL} /* sentinel */ +}; + PyTypeObject PyCode_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "code", @@ -508,7 +524,7 @@ PyTypeObject PyCode_Type = { offsetof(PyCodeObject, co_weakreflist), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + code_methods, /* tp_methods */ code_memberlist, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ -- cgit v0.12