(original) (raw)

changeset: 103315:66a539984c9c user: Victor Stinner victor.stinner@gmail.com date: Thu Sep 08 09:33:56 2016 -0700 files: Include/pymacro.h Objects/dictobject.c description: 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 -r 0bd618fe0639 -r 66a539984c9c Include/pymacro.h --- a/Include/pymacro.h Wed Sep 07 17:40:12 2016 -0700 +++ b/Include/pymacro.h Thu Sep 08 09:33:56 2016 -0700 @@ -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 -r 0bd618fe0639 -r 66a539984c9c Objects/dictobject.c --- a/Objects/dictobject.c Wed Sep 07 17:40:12 2016 -0700 +++ b/Objects/dictobject.c Thu Sep 08 09:33:56 2016 -0700 @@ -431,9 +431,10 @@ 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 @@ /* 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 * /victor.stinner@gmail.com