[Python-checkins] cpython: access dk_indices through a union

benjamin.peterson python-checkins at python.org
Thu Sep 8 15:20:39 EDT 2016


https://hg.python.org/cpython/rev/2f0289c5ee73
changeset:   103347:2f0289c5ee73
user:        Benjamin Peterson <benjamin at python.org>
date:        Thu Sep 08 12:20:12 2016 -0700
summary:
  access dk_indices through a union

files:
  Objects/dict-common.h |   7 ++++++-
  Objects/dictobject.c  |  28 ++++++++++++----------------
  2 files changed, 18 insertions(+), 17 deletions(-)


diff --git a/Objects/dict-common.h b/Objects/dict-common.h
--- a/Objects/dict-common.h
+++ b/Objects/dict-common.h
@@ -62,7 +62,12 @@
        - 8 bytes otherwise (Py_ssize_t*)
 
        Dynamically sized, 8 is minimum. */
-    char dk_indices[8];
+    union {
+        int8_t as_1[8];
+        int16_t as_2[4];
+        int32_t as_4[2];
+        int64_t as_8[1];
+    } dk_indices;
 
     /* "PyDictKeyEntry dk_entries[dk_usable];" array follows:
        see the DK_ENTRIES() macro */
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -293,7 +293,7 @@
             2 : sizeof(Py_ssize_t))
 #endif
 #define DK_ENTRIES(dk) \
-    ((PyDictKeyEntry*)(&(dk)->dk_indices[DK_SIZE(dk) * DK_IXSIZE(dk)]))
+    ((PyDictKeyEntry*)(&(dk)->dk_indices.as_1[DK_SIZE(dk) * DK_IXSIZE(dk)]))
 
 #define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
 #define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
@@ -312,21 +312,19 @@
     Py_ssize_t ix;
 
     if (s <= 0xff) {
-        char *indices = (char*)keys->dk_indices;
+        int8_t *indices = keys->dk_indices.as_1;
         ix = indices[i];
     }
     else if (s <= 0xffff) {
-        int16_t *indices = (int16_t*)keys->dk_indices;
+        int16_t *indices = keys->dk_indices.as_2;
         ix = indices[i];
     }
-#if SIZEOF_VOID_P > 4
     else if (s <= 0xffffffff) {
-        int32_t *indices = (int32_t*)keys->dk_indices;
+        int32_t *indices = keys->dk_indices.as_4;
         ix = indices[i];
     }
-#endif
     else {
-        Py_ssize_t *indices = (Py_ssize_t*)keys->dk_indices;
+        int64_t *indices = keys->dk_indices.as_8;
         ix = indices[i];
     }
     assert(ix >= DKIX_DUMMY);
@@ -342,24 +340,22 @@
     assert(ix >= DKIX_DUMMY);
 
     if (s <= 0xff) {
-        char *indices = (char*)keys->dk_indices;
+        int8_t *indices = keys->dk_indices.as_1;
         assert(ix <= 0x7f);
         indices[i] = (char)ix;
     }
     else if (s <= 0xffff) {
-        int16_t *indices = (int16_t*)keys->dk_indices;
+        int16_t *indices = keys->dk_indices.as_2;
         assert(ix <= 0x7fff);
         indices[i] = (int16_t)ix;
     }
-#if SIZEOF_VOID_P > 4
     else if (s <= 0xffffffff) {
-        int32_t *indices = (int32_t*)keys->dk_indices;
+        int32_t *indices = keys->dk_indices.as_4;
         assert(ix <= 0x7fffffff);
         indices[i] = (int32_t)ix;
     }
-#endif
     else {
-        Py_ssize_t *indices = (Py_ssize_t*)keys->dk_indices;
+        int64_t *indices = keys->dk_indices.as_8;
         indices[i] = ix;
     }
 }
@@ -418,8 +414,8 @@
         lookdict_split, /* dk_lookup */
         0, /* dk_usable (immutable) */
         0, /* dk_nentries */
-        {DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY,
-         DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY}, /* dk_indices */
+        .dk_indices = { .as_1 = {DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY,
+                                 DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY}},
 };
 
 static PyObject *empty_values[1] = { NULL };
@@ -468,7 +464,7 @@
     dk->dk_usable = usable;
     dk->dk_lookup = lookdict_unicode_nodummy;
     dk->dk_nentries = 0;
-    memset(&dk->dk_indices[0], 0xff, es * size);
+    memset(&dk->dk_indices.as_1[0], 0xff, es * size);
     memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable);
     return dk;
 }

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list