diff options
author | Björn-Egil Dahlberg <[email protected]> | 2015-06-05 16:00:30 +0200 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2015-06-08 10:46:05 +0200 |
commit | d79f77985100d2f90a0021f7ebae20ec7c99e93f (patch) | |
tree | 5e6410c1862009e7a6b7fd274f06e8fb32b93559 /erts/emulator/beam | |
parent | 24a161d8c479e70ad55ebac18cd92ecc41dd607c (diff) | |
download | otp-d79f77985100d2f90a0021f7ebae20ec7c99e93f.tar.gz otp-d79f77985100d2f90a0021f7ebae20ec7c99e93f.tar.bz2 otp-d79f77985100d2f90a0021f7ebae20ec7c99e93f.zip |
erts: Fix faulty list optimization in make_internal_hash
Reported-by: Rory Byrne
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/utils.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c index 965de748c9..cecd88197e 100644 --- a/erts/emulator/beam/utils.c +++ b/erts/emulator/beam/utils.c @@ -1140,7 +1140,7 @@ make_hash2(Eterm term) ERTS_UNDEF(hash_xor_pairs, 0); -/* (HCONST * {2, ..., 16}) mod 2^32 */ +/* (HCONST * {2, ..., 22}) mod 2^32 */ #define HCONST_2 0x3c6ef372UL #define HCONST_3 0xdaa66d2bUL #define HCONST_4 0x78dde6e4UL @@ -1161,6 +1161,7 @@ make_hash2(Eterm term) #define HCONST_19 0xbe1e08bbUL #define HCONST_20 0x5c558274UL #define HCONST_21 0xfa8cfc2dUL +#define HCONST_22 0x98c475e6UL #define HASH_MAP_TAIL (_make_header(1,_TAG_HEADER_REF)) #define HASH_MAP_PAIR (_make_header(2,_TAG_HEADER_REF)) @@ -1645,8 +1646,9 @@ make_internal_hash(Eterm term) break; ptr = list_val(term); } - if (c > 0) - UINT32_HASH(sh, HCONST_4); + if (c > 0) + UINT32_HASH_2(sh, (Uint32)c, HCONST_22); + if (is_list(term)) { tmp = CDR(ptr); CONST_HASH(HCONST_17); /* Hash CAR in cons cell */ |