aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorBjörn-Egil Dahlberg <[email protected]>2015-03-30 09:11:44 +0200
committerBjörn-Egil Dahlberg <[email protected]>2015-03-30 09:11:44 +0200
commit346fb20cc0eb84a4ed9758d39ec41bea76ed6999 (patch)
tree71df712b011aafdc610da772e07171dd4e2d746e /erts
parentf4339951b2d4453314643e805613672e7d7e30ad (diff)
parent43b489d3901543251a6a1a49cb899b5b199864ba (diff)
downloadotp-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.c4
-rw-r--r--erts/emulator/test/map_SUITE.erl14
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}),