summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/erl_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/erl_map.c')
-rw-r--r--erts/emulator/beam/erl_map.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_map.c b/erts/emulator/beam/erl_map.c
index 62dd85e425..9097a36e62 100644
--- a/erts/emulator/beam/erl_map.c
+++ b/erts/emulator/beam/erl_map.c
@@ -973,7 +973,13 @@ BIF_RETTYPE maps_keys_1(BIF_ALIST_1) {
HIPE_WRAPPER_BIF_DISABLE_GC(maps_merge, 2)
BIF_RETTYPE maps_merge_2(BIF_ALIST_2) {
- if (is_flatmap(BIF_ARG_1)) {
+ if (BIF_ARG_1 == BIF_ARG_2) {
+ /* Merging upon itself always returns itself */
+ if (is_map(BIF_ARG_1)) {
+ return BIF_ARG_1;
+ }
+ BIF_P->fvalue = BIF_ARG_1;
+ } else if (is_flatmap(BIF_ARG_1)) {
if (is_flatmap(BIF_ARG_2)) {
BIF_RET(flatmap_merge(BIF_P, BIF_ARG_1, BIF_ARG_2));
} else if (is_hashmap(BIF_ARG_2)) {
@@ -1008,6 +1014,9 @@ static Eterm flatmap_merge(Process *p, Eterm nodeA, Eterm nodeB) {
n1 = flatmap_get_size(mp1);
n2 = flatmap_get_size(mp2);
+ if (n1 == 0) return nodeB;
+ if (n2 == 0) return nodeA;
+
need = MAP_HEADER_FLATMAP_SZ + 1 + 2 * (n1 + n2);
hp = HAlloc(p, need);
@@ -1127,6 +1136,7 @@ static Eterm map_merge_mixed(Process *p, Eterm flat, Eterm tree, int swap_args)
mp = (flatmap_t*)flatmap_val(flat);
n = flatmap_get_size(mp);
+ if (n == 0) return tree;
ks = flatmap_get_keys(mp);
vs = flatmap_get_values(mp);