]> granicus.if.org Git - python/commitdiff
Add Py_MEMBER_SIZE macro
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 8 Sep 2016 16:33:56 +0000 (09:33 -0700)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 8 Sep 2016 16:33:56 +0000 (09:33 -0700)
Issue #27350: use Py_MEMBER_SIZE() macro to get the size of
PyDictKeyEntry.dk_indices, rather than hardcoding 8.

Include/pymacro.h
Objects/dictobject.c

index d1345c499b29b1814ba4cc5bd95372e644c1e149..2a839abf81344131ee9006e4d7a44ac7c616f3c7 100644 (file)
@@ -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))
 
index 8e5fe82d5ea31d98819a2e08afff0da6d87e4265..df5f29fdf56e5a21cb72ef97756bab5cc195a090 100644 (file)
@@ -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 *