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