[Python-checkins] [3.11] gh-101266: Revert fix __sizeof__ for subclasses of int (#101638)

mdickinson webhook-mailer at python.org
Tue Feb 7 06:44:50 EST 2023


https://github.com/python/cpython/commit/358b02dac478b9ce379ab5982400bb8ecf11a2ee
commit: 358b02dac478b9ce379ab5982400bb8ecf11a2ee
branch: 3.11
author: Mark Dickinson <dickinsm at gmail.com>
committer: mdickinson <dickinsm at gmail.com>
date: 2023-02-07T11:44:43Z
summary:

[3.11] gh-101266: Revert fix __sizeof__ for subclasses of int (#101638)

Revert "[3.11] gh-101266: Fix __sizeof__ for subclasses of int (GH-101394) (#101579)"

This reverts commit cf89c16486a4cc297413e17d32082ec4f389d725.

files:
D Misc/NEWS.d/next/Core and Builtins/2023-01-28-13-11-52.gh-issue-101266.AxV3OF.rst
M Lib/test/test_long.py
M Objects/boolobject.c
M Objects/longobject.c

diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py
index 03bed4c41f5a..77b37ca1fa4a 100644
--- a/Lib/test/test_long.py
+++ b/Lib/test/test_long.py
@@ -1596,44 +1596,5 @@ def test_square(self):
                 self.assertEqual(n**2,
                     (1 << (2 * bitlen)) - (1 << (bitlen + 1)) + 1)
 
-    def test___sizeof__(self):
-        self.assertEqual(int.__itemsize__, sys.int_info.sizeof_digit)
-
-        # Pairs (test_value, number of allocated digits)
-        test_values = [
-            # We always allocate space for at least one digit, even for
-            # a value of zero; sys.getsizeof should reflect that.
-            (0, 1),
-            (1, 1),
-            (-1, 1),
-            (BASE-1, 1),
-            (1-BASE, 1),
-            (BASE, 2),
-            (-BASE, 2),
-            (BASE*BASE - 1, 2),
-            (BASE*BASE, 3),
-        ]
-
-        for value, ndigits in test_values:
-            with self.subTest(value):
-                self.assertEqual(
-                    value.__sizeof__(),
-                    int.__basicsize__ + int.__itemsize__ * ndigits
-                )
-
-        # Same test for a subclass of int.
-        class MyInt(int):
-            pass
-
-        self.assertEqual(MyInt.__itemsize__, sys.int_info.sizeof_digit)
-
-        for value, ndigits in test_values:
-            with self.subTest(value):
-                self.assertEqual(
-                    MyInt(value).__sizeof__(),
-                    MyInt.__basicsize__ + MyInt.__itemsize__ * ndigits
-                )
-
-
 if __name__ == "__main__":
     unittest.main()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-01-28-13-11-52.gh-issue-101266.AxV3OF.rst b/Misc/NEWS.d/next/Core and Builtins/2023-01-28-13-11-52.gh-issue-101266.AxV3OF.rst
deleted file mode 100644
index 51999bacb8de..000000000000
--- a/Misc/NEWS.d/next/Core and Builtins/2023-01-28-13-11-52.gh-issue-101266.AxV3OF.rst	
+++ /dev/null
@@ -1 +0,0 @@
-Fix :func:`sys.getsizeof` reporting for :class:`int` subclasses.
diff --git a/Objects/boolobject.c b/Objects/boolobject.c
index 01acf0f00b66..8a20e368d4a4 100644
--- a/Objects/boolobject.c
+++ b/Objects/boolobject.c
@@ -4,8 +4,6 @@
 #include "pycore_object.h"      // _Py_FatalRefcountError()
 #include "pycore_runtime.h"       // _Py_ID()
 
-#include <stddef.h>
-
 /* We define bool_repr to return "False" or "True" */
 
 static PyObject *
@@ -156,8 +154,8 @@ bool_dealloc(PyObject* Py_UNUSED(ignore))
 PyTypeObject PyBool_Type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "bool",
-    offsetof(struct _longobject, ob_digit),     /* tp_basicsize */
-    sizeof(digit),                              /* tp_itemsize */
+    sizeof(struct _longobject),
+    0,
     bool_dealloc,                               /* tp_dealloc */
     0,                                          /* tp_vectorcall_offset */
     0,                                          /* tp_getattr */
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 39bd72ce5598..84c05e8aabdf 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -5664,10 +5664,13 @@ static Py_ssize_t
 int___sizeof___impl(PyObject *self)
 /*[clinic end generated code: output=3303f008eaa6a0a5 input=9b51620c76fc4507]*/
 {
-    /* using Py_MAX(..., 1) because we always allocate space for at least
-       one digit, even though the integer zero has a Py_SIZE of 0 */
-    Py_ssize_t ndigits = Py_MAX(Py_ABS(Py_SIZE(self)), 1);
-    return Py_TYPE(self)->tp_basicsize + Py_TYPE(self)->tp_itemsize * ndigits;
+    Py_ssize_t res;
+
+    res = offsetof(PyLongObject, ob_digit)
+        /* using Py_MAX(..., 1) because we always allocate space for at least
+           one digit, even though the integer zero has a Py_SIZE of 0 */
+        + Py_MAX(Py_ABS(Py_SIZE(self)), 1)*sizeof(digit);
+    return res;
 }
 
 /*[clinic input]



More information about the Python-checkins mailing list