From: Victor Stinner Date: Thu, 8 Sep 2016 16:33:56 +0000 (-0700) Subject: Add Py_MEMBER_SIZE macro X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=98ee9d5b738eaf098cfd37c9383f8f2496a964d5;p=python Add Py_MEMBER_SIZE macro Issue #27350: use Py_MEMBER_SIZE() macro to get the size of PyDictKeyEntry.dk_indices, rather than hardcoding 8. --- diff --git a/Include/pymacro.h b/Include/pymacro.h index d1345c499b..2a839abf81 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -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)) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 8e5fe82d5e..df5f29fdf5 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -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 *