diff options
author | Sverker Eriksson <[email protected]> | 2015-03-19 15:40:29 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2015-03-19 16:06:40 +0100 |
commit | 65c7116bb38013c3d829f21b00bf094606e46731 (patch) | |
tree | 8615027794fddcca8eda29dc551f9bd14e88a25a | |
parent | c283f8035e1ac18a6d150a2013c7f929cc32bffc (diff) | |
download | otp-65c7116bb38013c3d829f21b00bf094606e46731.tar.gz otp-65c7116bb38013c3d829f21b00bf094606e46731.tar.bz2 otp-65c7116bb38013c3d829f21b00bf094606e46731.zip |
erts: Fix bug in binary_to_term with more than one big map
-rw-r--r-- | erts/emulator/beam/external.c | 2 | ||||
-rw-r--r-- | erts/emulator/test/map_SUITE.erl | 7 |
2 files changed, 8 insertions, 1 deletions
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c index 9a5ef56c47..458ebd8aa0 100644 --- a/erts/emulator/beam/external.c +++ b/erts/emulator/beam/external.c @@ -3899,7 +3899,6 @@ dec_term_atom_common: /* Iterate through all the hamts and build tree nodes. */ if (hamt_list) { - struct dec_term_hamt_placeholder* hamt = hamt_list; ErtsHeapFactory factory; factory.p = NULL; @@ -3907,6 +3906,7 @@ dec_term_atom_common: /* We assume heap will suffice (see hashmap_over_estimated_heap_size) */ do { + struct dec_term_hamt_placeholder* hamt = hamt_list; *hamt->objp = erts_hashmap_from_array(&factory, hamt->leafs, hamt->size, diff --git a/erts/emulator/test/map_SUITE.erl b/erts/emulator/test/map_SUITE.erl index c421886431..91a5706320 100644 --- a/erts/emulator/test/map_SUITE.erl +++ b/erts/emulator/test/map_SUITE.erl @@ -1147,6 +1147,13 @@ t_map_encode_decode(Config) when is_list(Config) -> 97,55 % 55 :: integer() >>), + %% many maps in same binary + MapList = lists:foldl(fun(K, [M|_]=Acc) -> [M#{K => K} | Acc] end, + [#{}], + lists:seq(1,100)), + MapList = binary_to_term(term_to_binary(MapList)), + MapListR = lists:reverse(MapList), + MapListR = binary_to_term(term_to_binary(MapListR)), %% error cases %% template: <<131,116,0,0,0,2,100,0,1,97,100,0,1,98,97,1,97,1>> |