diff options
author | Björn-Egil Dahlberg <[email protected]> | 2015-03-30 09:11:44 +0200 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2015-03-30 09:11:44 +0200 |
commit | 346fb20cc0eb84a4ed9758d39ec41bea76ed6999 (patch) | |
tree | 71df712b011aafdc610da772e07171dd4e2d746e /erts | |
parent | f4339951b2d4453314643e805613672e7d7e30ad (diff) | |
parent | 43b489d3901543251a6a1a49cb899b5b199864ba (diff) | |
download | otp-346fb20cc0eb84a4ed9758d39ec41bea76ed6999.tar.gz otp-346fb20cc0eb84a4ed9758d39ec41bea76ed6999.tar.bz2 otp-346fb20cc0eb84a4ed9758d39ec41bea76ed6999.zip |
Merge branch 'egil/fix-make_internal_hash-float'
* egil/fix-make_internal_hash-float:
erts: Add tests for internal_hash
erts: Fix make_internal_hash for 0.0 vs -0.0
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/beam/utils.c | 4 | ||||
-rw-r--r-- | erts/emulator/test/map_SUITE.erl | 14 |
2 files changed, 17 insertions, 1 deletions
diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c index 8fc8962e4f..91f4accd30 100644 --- a/erts/emulator/beam/utils.c +++ b/erts/emulator/beam/utils.c @@ -1894,10 +1894,12 @@ make_internal_hash(Eterm term) { FloatDef ff; GET_DOUBLE(term, ff); + if (ff.fd == 0.0) { + ff.fd = 0.0; /* ensure pos. 0.0 */ + } UINT32_HASH_2(ff.fw[0], ff.fw[1], HCONST_12); goto pop_next; } - default: erl_exit(1, "Invalid tag in make_hash2(0x%X)\n", term); } diff --git a/erts/emulator/test/map_SUITE.erl b/erts/emulator/test/map_SUITE.erl index 33bf415480..a72c8dafe4 100644 --- a/erts/emulator/test/map_SUITE.erl +++ b/erts/emulator/test/map_SUITE.erl @@ -66,6 +66,7 @@ %% misc t_hashmap_balance/1, t_erts_internal_order/1, + t_erts_internal_hash/1, t_pdict/1, t_ets/1, t_dets/1, @@ -119,6 +120,7 @@ all() -> [ %% Other functions t_hashmap_balance, t_erts_internal_order, + t_erts_internal_hash, t_pdict, t_ets, t_tracing @@ -2291,6 +2293,18 @@ t_erts_internal_order(_Config) when is_list(_Config) -> 1 = maps:get(0,M1), ok. +t_erts_internal_hash(_Config) when is_list(_Config) -> + K1 = 0.0, + K2 = 0.0/-1, + + M1 = (maps:from_list([{I,I}||I<-lists:seq(1,32)]))#{ K1 => a, K2 => b }, + b = maps:get(K2,M1), + + M2 = (maps:from_list([{I,I}||I<-lists:seq(1,32)]))#{ K2 => a, K1 => b }, + b = maps:get(K1,M2), + + ok. + t_pdict(_Config) -> put(#{ a => b, b => a},#{ c => d}), |