mirror of https://github.com/python/cpython
Add Py_MEMBER_SIZE macro
Issue #27350: use Py_MEMBER_SIZE() macro to get the size of PyDictKeyEntry.dk_indices, rather than hardcoding 8.
This commit is contained in:
parent
742da040db
commit
98ee9d5b73
|
@ -18,6 +18,9 @@
|
|||
by "__LINE__". */
|
||||
#define Py_STRINGIFY(x) _Py_XSTRINGIFY(x)
|
||||
|
||||
/* Get the size of a structure member in bytes */
|
||||
#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
|
||||
|
||||
/* Argument must be a char or an int in [-128, 127] or [0, 255]. */
|
||||
#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff))
|
||||
|
||||
|
|
|
@ -431,9 +431,10 @@ static PyDictKeysObject *new_keys_object(Py_ssize_t size)
|
|||
dk = keys_free_list[--numfreekeys];
|
||||
}
|
||||
else {
|
||||
dk = PyObject_MALLOC(sizeof(PyDictKeysObject) - 8 +
|
||||
es * size +
|
||||
sizeof(PyDictKeyEntry) * usable);
|
||||
dk = PyObject_MALLOC(sizeof(PyDictKeysObject)
|
||||
- Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
|
||||
+ es * size
|
||||
+ sizeof(PyDictKeyEntry) * usable);
|
||||
if (dk == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
|
@ -2786,17 +2787,20 @@ _PyDict_SizeOf(PyDictObject *mp)
|
|||
/* If the dictionary is split, the keys portion is accounted-for
|
||||
in the type object. */
|
||||
if (mp->ma_keys->dk_refcnt == 1)
|
||||
res += sizeof(PyDictKeysObject) - 8 + DK_IXSIZE(mp->ma_keys) * size +
|
||||
sizeof(PyDictKeyEntry) * usable;
|
||||
res += (sizeof(PyDictKeysObject)
|
||||
- Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
|
||||
+ DK_IXSIZE(mp->ma_keys) * size
|
||||
+ sizeof(PyDictKeyEntry) * usable);
|
||||
return res;
|
||||
}
|
||||
|
||||
Py_ssize_t
|
||||
_PyDict_KeysSize(PyDictKeysObject *keys)
|
||||
{
|
||||
return sizeof(PyDictKeysObject) - 8
|
||||
+ DK_IXSIZE(keys) * DK_SIZE(keys)
|
||||
+ USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry);
|
||||
return (sizeof(PyDictKeysObject)
|
||||
- Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
|
||||
+ DK_IXSIZE(keys) * DK_SIZE(keys)
|
||||
+ USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
|
Loading…
Reference in New Issue