https://github.com/python/cpython/commit/0964f9f1847bcbe90345eeafd65813d06db4ba3b
commit: 0964f9f1847bcbe90345eeafd65813d06db4ba3b
branch: 3.12
author: Miss Islington (bot) <[email protected]>
committer: vstinner <[email protected]>
date: 2024-12-11T12:21:07+01:00
summary:

[3.12] GH-117195: Avoid assertion error in `object.__sizeof__` (GH-117220) 
(#127605)

GH-117195: Avoid assertion error in `object.__sizeof__` (GH-117220)
(cherry picked from commit 406ffb5293a8c9ca315bf63de1ee36a9b33f9aaf)

Co-authored-by: Mark Shannon <[email protected]>

files:
A Misc/NEWS.d/next/Core and 
Builtins/2024-03-25-15-07-01.gh-issue-117195.OWakgD.rst
M Lib/test/test_long.py
M Objects/typeobject.c

diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py
index d299c34cec076d..41b973da2c7df0 100644
--- a/Lib/test/test_long.py
+++ b/Lib/test/test_long.py
@@ -1639,6 +1639,8 @@ class MyInt(int):
                     MyInt.__basicsize__ + MyInt.__itemsize__ * ndigits
                 )
 
+        # GH-117195 -- This shouldn't crash
+        object.__sizeof__(1)
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/Misc/NEWS.d/next/Core and 
Builtins/2024-03-25-15-07-01.gh-issue-117195.OWakgD.rst b/Misc/NEWS.d/next/Core 
and Builtins/2024-03-25-15-07-01.gh-issue-117195.OWakgD.rst
new file mode 100644
index 00000000000000..ae1e5acc5c333b
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and 
Builtins/2024-03-25-15-07-01.gh-issue-117195.OWakgD.rst 
@@ -0,0 +1,2 @@
+Avoid assertion failure for debug builds when calling
+``object.__sizeof__(1)``
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 5bca4b4e788608..06857e3685740a 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -6462,8 +6462,11 @@ object___sizeof___impl(PyObject *self)
 
     res = 0;
     isize = Py_TYPE(self)->tp_itemsize;
-    if (isize > 0)
-        res = Py_SIZE(self) * isize;
+    if (isize > 0) {
+        /* This assumes that ob_size is valid if tp_itemsize is not 0,
+         which isn't true for PyLongObject. */
+        res = _PyVarObject_CAST(self)->ob_size * isize;
+    }
     res += Py_TYPE(self)->tp_basicsize;
 
     return PyLong_FromSsize_t(res);

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to