diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2023-02-05 10:02:53 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-05 10:02:53 +0000 |
commit | 39017e04b55d4c110787551dc9a0cb753f27d700 (patch) | |
tree | 43c39ae5fa296b5bf195614330b0441d6c96db7a /Objects/longobject.c | |
parent | 9b60ee976a6b66fe96c2d39051612999c26561e5 (diff) | |
download | cpython-git-39017e04b55d4c110787551dc9a0cb753f27d700.tar.gz |
gh-101266: Fix __sizeof__ for subclasses of int (#101394)
Fix the behaviour of the `__sizeof__` method (and hence the results returned by `sys.getsizeof`) for subclasses of `int`. Previously, `int` subclasses gave identical results to the `int` base class, ignoring the presence of the instance dictionary.
<!-- gh-issue-number: gh-101266 -->
* Issue: gh-101266
<!-- /gh-issue-number -->
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r-- | Objects/longobject.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c index 65bf15648b..8293f133be 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5882,13 +5882,10 @@ static Py_ssize_t int___sizeof___impl(PyObject *self) /*[clinic end generated code: output=3303f008eaa6a0a5 input=9b51620c76fc4507]*/ { - Py_ssize_t res; - - res = offsetof(PyLongObject, long_value.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; + /* 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; } /*[clinic input] |