Author: Richard Plangger <planri...@gmail.com>
Branch: 
Changeset: r90720:0555945f3314
Date: 2017-03-16 08:46 +0100
http://bitbucket.org/pypy/pypy/changeset/0555945f3314/

Log:    siphash24 changes for big endian machines, only byte swap when
        directly loading from memory. in any other case we already place the
        bytes into int64 integers

diff --git a/rpython/rlib/rsiphash.py b/rpython/rlib/rsiphash.py
--- a/rpython/rlib/rsiphash.py
+++ b/rpython/rlib/rsiphash.py
@@ -24,14 +24,11 @@
 if sys.byteorder == 'little':
     def _le64toh(x):
         return x
+    def _le32toh(x):
+        return x
 else:
     _le64toh = rarithmetic.byteswap
-
-
-class Seed:
-    k0l = k1l = r_uint64(0)
-seed = Seed()
-
+    _le32toh = rarithmetic.byteswap
 
 def _decode64(s):
     return (r_uint64(ord(s[0])) |
@@ -43,6 +40,11 @@
             r_uint64(ord(s[6])) << 48 |
             r_uint64(ord(s[7])) << 56)
 
+class Seed:
+    k0l = k1l = r_uint64(0)
+seed = Seed()
+
+
 def select_random_seed(s):
     """'s' is a string of length 16"""
     seed.k0l = _decode64(s)
@@ -177,17 +179,13 @@
     """For tests."""
     global misaligned_is_fine
     old = seed.k0l, seed.k1l, misaligned_is_fine
-    seed.k0l = _le64toh(r_uint64(new_k0))
-    seed.k1l = _le64toh(r_uint64(new_k1))
+    seed.k0l = r_uint64(new_k0)
+    seed.k1l = r_uint64(new_k1)
     if test_misaligned_path:
         misaligned_is_fine = False
     yield
     seed.k0l, seed.k1l, misaligned_is_fine = old
 
-def get_current_seed():
-    return _le64toh(seed.k0l), _le64toh(seed.k1l)
-
-
 magic0 = r_uint64(0x736f6d6570736575)
 magic1 = r_uint64(0x646f72616e646f6d)
 magic2 = r_uint64(0x6c7967656e657261)
@@ -271,7 +269,8 @@
         size = 4
     if size == 4:
         if direct:
-            t |= r_uint64(llop.raw_load(rffi.UINT, addr_in, index))
+            v = _le32toh(r_uint32(llop.raw_load(rffi.UINT, addr_in, index)))
+            t |= r_uint64(v)
             size = 0
         else:
             t |= r_uint64(llop.raw_load(rffi.UCHAR, addr_in, index + 3)) << 24
@@ -287,7 +286,7 @@
         size = 0
     assert size == 0
 
-    b |= _le64toh(t)
+    b |= t
 
     v3 ^= b
     v0, v1, v2, v3 = _double_round(v0, v1, v2, v3)
diff --git a/rpython/rlib/test/test_rsiphash.py 
b/rpython/rlib/test/test_rsiphash.py
--- a/rpython/rlib/test/test_rsiphash.py
+++ b/rpython/rlib/test/test_rsiphash.py
@@ -118,8 +118,9 @@
             123, 123, intmask(15988776847138518036),
             456, 456, intmask(15988776847138518036),
             789, 789]
-        assert s1[8] in [intmask(17593683438421985039),    # ucs2 mode
-                         intmask(94801584261658677)]       # ucs4 mode
+        assert s1[8] in [intmask(17593683438421985039),    # ucs2 mode little 
endian
+                         intmask(94801584261658677),       # ucs4 mode little 
endian
+                         intmask(3849431280840015342),]    # ucs4 mode big 
endian
 
         os.environ['PYTHONHASHSEED'] = '3987654321'
         s1 = getall()
@@ -127,8 +128,9 @@
             123, 123, intmask(5890804383681474441),
             456, 456, intmask(5890804383681474441),
             789, 789]
-        assert s1[8] in [intmask(4192582507672183374),     # ucs2 mode
-                         intmask(7179255293164649778)]     # ucs4 mode
+        assert s1[8] in [intmask(4192582507672183374),     # ucs2 mode little 
endian
+                         intmask(7179255293164649778),     # ucs4 mode little 
endian
+                         intmask(-3945781295304514711),]   # ucs4 mode big 
endian
 
         for env in ['', 'random']:
             os.environ['PYTHONHASHSEED'] = env
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to