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))
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;
/* 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 *