diff options
author | Victor Stinner <vstinner@python.org> | 2022-11-30 16:22:52 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-30 16:22:52 (GMT) |
commit | 85dd6cb6df996b1197266d1a50ecc9187a91e481 (patch) | |
tree | 774e93130f5e1b81dcd7a94982c189c718e84b91 /Objects | |
parent | 18a6967544795cdcce45b45700b7a9ed3994b8fb (diff) | |
download | cpython-85dd6cb6df996b1197266d1a50ecc9187a91e481.zip cpython-85dd6cb6df996b1197266d1a50ecc9187a91e481.tar.gz cpython-85dd6cb6df996b1197266d1a50ecc9187a91e481.tar.bz2 |
gh-99845: Use size_t type in __sizeof__() methods (#99846)
The implementation of __sizeof__() methods using _PyObject_SIZE() now
use an unsigned type (size_t) to compute the size, rather than a signed
type (Py_ssize_t).
Cast explicitly signed (Py_ssize_t) values to unsigned type
(Py_ssize_t).
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/bytearrayobject.c | 7 | ||||
-rw-r--r-- | Objects/listobject.c | 7 | ||||
-rw-r--r-- | Objects/setobject.c | 11 |
3 files changed, 11 insertions, 14 deletions
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 0ba6fb5..f24690a 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2151,10 +2151,9 @@ static PyObject * bytearray_sizeof_impl(PyByteArrayObject *self) /*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/ { - Py_ssize_t res; - - res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char); - return PyLong_FromSsize_t(res); + size_t res = _PyObject_SIZE(Py_TYPE(self)); + res += (size_t)self->ob_alloc * sizeof(char); + return PyLong_FromSize_t(res); } static PySequenceMethods bytearray_as_sequence = { diff --git a/Objects/listobject.c b/Objects/listobject.c index da623c9..0e696fb 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2806,10 +2806,9 @@ static PyObject * list___sizeof___impl(PyListObject *self) /*[clinic end generated code: output=3417541f95f9a53e input=b8030a5d5ce8a187]*/ { - Py_ssize_t res; - - res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * sizeof(void*); - return PyLong_FromSsize_t(res); + size_t res = _PyObject_SIZE(Py_TYPE(self)); + res += (size_t)self->allocated * sizeof(void*); + return PyLong_FromSize_t(res); } static PyObject *list_iter(PyObject *seq); diff --git a/Objects/setobject.c b/Objects/setobject.c index ae9e9b9..fcdda2a 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1957,12 +1957,11 @@ done: static PyObject * set_sizeof(PySetObject *so, PyObject *Py_UNUSED(ignored)) { - Py_ssize_t res; - - res = _PyObject_SIZE(Py_TYPE(so)); - if (so->table != so->smalltable) - res = res + (so->mask + 1) * sizeof(setentry); - return PyLong_FromSsize_t(res); + size_t res = _PyObject_SIZE(Py_TYPE(so)); + if (so->table != so->smalltable) { + res += ((size_t)so->mask + 1) * sizeof(setentry); + } + return PyLong_FromSize_t(res); } PyDoc_STRVAR(sizeof_doc, "S.__sizeof__() -> size of S in memory, in bytes"); |