[Python-checkins] fix my byte-swapping implementation (#4772)

Benjamin Peterson webhook-mailer at python.org
Sat Dec 9 15:19:00 EST 2017


https://github.com/python/cpython/commit/83620773eef7380178ba84217a26fe22d1636474
commit: 83620773eef7380178ba84217a26fe22d1636474
branch: master
author: Benjamin Peterson <benjamin at python.org>
committer: GitHub <noreply at github.com>
date: 2017-12-09T12:18:56-08:00
summary:

fix my byte-swapping implementation (#4772)

files:
M Python/import.c

diff --git a/Python/import.c b/Python/import.c
index b2d751111bf..892f3d1c6e4 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -2197,21 +2197,21 @@ static PyObject *
 _imp_source_hash_impl(PyObject *module, long key, Py_buffer *source)
 /*[clinic end generated code: output=edb292448cf399ea input=9aaad1e590089789]*/
 {
-    uint64_t hash = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
+    union {
+        uint64_t x;
+        char data[sizeof(uint64_t)];
+    } hash;
+    hash.x = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
 #if !PY_LITTLE_ENDIAN
     // Force to little-endian. There really ought to be a succinct standard way
     // to do this.
-    union {
-        uint64_t x;
-        unsigned char data[sizeof(uint64_t)];
-    } pun;
-    pun.x = hash;
-    for (size_t i = 0; i < sizeof(pun.data); i++) {
-        pun.data[sizeof(pun.data) - i - 1] = pun.data[i];
+    for (size_t i = 0; i < sizeof(hash.data)/2; i++) {
+        char tmp = hash.data[i];
+        hash.data[i] = hash.data[sizeof(hash.data) - i - 1];
+        hash.data[sizeof(hash.data) - i - 1] = tmp;
     }
-    hash = pun.x;
 #endif
-    return PyBytes_FromStringAndSize((const char *)&hash, sizeof(hash));
+    return PyBytes_FromStringAndSize(hash.data, sizeof(hash.data));
 }
 
 



More information about the Python-checkins mailing list