]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-101266: Revert fix __sizeof__ for subclasses of int (#101638)
authorMark Dickinson <dickinsm@gmail.com>
Tue, 7 Feb 2023 11:44:43 +0000 (11:44 +0000)
committerGitHub <noreply@github.com>
Tue, 7 Feb 2023 11:44:43 +0000 (11:44 +0000)
Revert "[3.11] gh-101266: Fix __sizeof__ for subclasses of int (GH-101394) (#101579)"

This reverts commit cf89c16486a4cc297413e17d32082ec4f389d725.

Lib/test/test_long.py
Misc/NEWS.d/next/Core and Builtins/2023-01-28-13-11-52.gh-issue-101266.AxV3OF.rst [deleted file]
Objects/boolobject.c
Objects/longobject.c

index 03bed4c41f5a0c0e056b8fce183c48831113084c..77b37ca1fa4afee805a57ee2eba4071bf9d60bc2 100644 (file)
@@ -1596,44 +1596,5 @@ class LongTest(unittest.TestCase):
                 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 (file)
index 51999ba..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Fix :func:`sys.getsizeof` reporting for :class:`int` subclasses.
index 01acf0f00b66fe00e67dcaec8c6fc96f0718de22..8a20e368d4a42bc65a69e7fb9a4e7bb06996e286 100644 (file)
@@ -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 */
index 39bd72ce5598d1513738f70c7466eedcc20e8def..84c05e8aabdfdabac0b7b622afa1e8d38d8ae4a0 100644 (file)
@@ -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]