diff options
| author | Sverker Eriksson <sverker@erlang.org> | 2023-03-17 13:29:57 +0100 |
|---|---|---|
| committer | Sverker Eriksson <sverker@erlang.org> | 2023-03-17 13:31:55 +0100 |
| commit | 9f0f983963bb54df6314c1cc759b7cd1b4ed91de (patch) | |
| tree | 4f3954a5d7d03628de2960cbb7c3bb377b10c028 /erts/emulator/test | |
| parent | 8927e859b7854bc7f89d8a1c72eabfec36fe9598 (diff) | |
| parent | c684d1a7a295df555c5d1aef81ce566d92d573fe (diff) | |
| download | erlang-9f0f983963bb54df6314c1cc759b7cd1b4ed91de.tar.gz | |
Merge 'sverker/24/erts/maps-merge-opt/OTP-18523' into sverker/maps-merge-opt
Diffstat (limited to 'erts/emulator/test')
| -rw-r--r-- | erts/emulator/test/map_SUITE.erl | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/erts/emulator/test/map_SUITE.erl b/erts/emulator/test/map_SUITE.erl index e64311c2e5..99e5e1af7d 100644 --- a/erts/emulator/test/map_SUITE.erl +++ b/erts/emulator/test/map_SUITE.erl @@ -2135,12 +2135,7 @@ t_bif_map_merge(Config) when is_list(Config) -> M0 = #{ "hi" => "hello", int => 3, <<"key">> => <<"value">>, 4 => number, 18446744073709551629 => wat}, - - #{ "hi" := "hello", int := 3, <<"key">> := <<"value">>, - 4 := number, 18446744073709551629 := wat} = maps:merge(#{}, M0), - - #{ "hi" := "hello", int := 3, <<"key">> := <<"value">>, - 4 := number, 18446744073709551629 := wat} = maps:merge(M0, #{}), + merge_with_empty(M0), M1 = #{ "hi" => "hello again", float => 3.3, {1,2} => "tuple", 4 => integer }, @@ -2155,6 +2150,7 @@ t_bif_map_merge(Config) when is_list(Config) -> Is = lists:seq(1,N), M2 = maps:from_list([{I,I}||I<-Is]), 150000 = maps:size(M2), + merge_with_empty(M2), M3 = maps:from_list([{<<I:32>>,I}||I<-Is]), 150000 = maps:size(M3), M4 = maps:merge(M2,M3), @@ -2193,6 +2189,28 @@ t_bif_map_merge(Config) when is_list(Config) -> M11 = maps:merge(M9,M10), ok = check_keys_exist(Ks1 ++ Ks2, M11), + %% Verify map and/or key tuple reuse + + MS = #{ "hi" => "hello", int => 3, <<"key">> => <<"value">>}, + merge_with_empty(MS), + MS_keys = erts_internal:map_to_tuple_keys(MS), + + %% key tuple reuse + MS_a = maps:merge(MS, #{int => 4}), + true = erts_debug:same(erts_internal:map_to_tuple_keys(MS_a), MS_keys), + %% map reuse + MS_b = maps:merge(#{int => 4}, MS), + true = erts_debug:same(MS_b, MS), + + %% mutated map reuse with literal key tuple + MS_c = maps:put(int, 4, maps:remove(int, MS)), + false = erts_debug:same(erts_internal:map_to_tuple_keys(MS_c), MS_keys), + MS_cc = maps:merge(MS, MS_c), + true = erts_debug:same(MS_cc, MS_c), + + MS_d = maps:merge(MS_c, MS), + true = erts_debug:same(MS_d, MS), + %% error case do_badmap(fun(T) -> {'EXIT',{{badmap,T},[{maps,merge,_,_}|_]}} = @@ -2204,6 +2222,15 @@ t_bif_map_merge(Config) when is_list(Config) -> end), ok. +merge_with_empty(M0) -> + M0_1 = maps:merge(#{}, M0), + M0 = M0_1, + true = erts_debug:same(M0, M0_1), + + M0_2 = maps:merge(M0, #{}), + M0 = M0_2, + true = erts_debug:same(M0, M0_2), + ok. t_bif_map_put(Config) when is_list(Config) -> M0 = #{ "hi" => "hello", int => 3, <<"key">> => <<"value">>, |
