Author: Richard Plangger <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit