]> granicus.if.org Git - python/commitdiff
Issue #15456: Fix code __sizeof__ after #12399 change.
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 26 Jul 2012 20:23:23 +0000 (22:23 +0200)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 26 Jul 2012 20:23:23 +0000 (22:23 +0200)
Patch by Serhiy Storchaka.

Lib/test/test_sys.py
Misc/NEWS
Objects/codeobject.c

index 9a6dd5ba69835b6ed282ba15f0ab1f17965439ee..b04df144bdecda031f2750e5db33bebbe05c7ce5 100644 (file)
@@ -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)
index 8d469ac1d79400f74a645c204b571d095a0378b5..508ec1bd5f523aa834df3d497207efe454e90b6d 100644 (file)
--- 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
index 550e28498d20658be44be7d9236f2191837ffc3b..9713f61b244a714c9ddf8fc8a5e830fd48c31537 100644 (file)
@@ -374,6 +374,17 @@ code_dealloc(PyCodeObject *co)
     PyObject_DEL(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)
 {
@@ -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 */