LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File 0146-Correctly-handle-get_map_elements-with-a-literal-map.patch of Package erlang (Project home:Ledest:erlang:20)

From 2371741165a0f6c39893fe9f586d7586fd7d02a1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Fri, 16 Mar 2018 16:13:08 +0100
Subject: [PATCH 2/2] Correctly handle get_map_elements with a literal map

A get_map_elements instruction that has a literal map operand
would never be translated to a i_get_map_element instruction.
That would be a problem for the following instruction:

    get_map_elements Fail #{} {x,0}, {x,1}

Since the key is not a literal, get_map_element must be used,
since get_map_elements requires that a hash value can be
calculated for each element.

When the instruction is translated to i_get_map_element, the
hash value will be set to 0 and an assertion will trigger in
the debug build.
---
 erts/emulator/beam/ops.tab | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab
index 77e375f2c0..bc765a8c94 100644
--- a/erts/emulator/beam/ops.tab
+++ b/erts/emulator/beam/ops.tab
@@ -1464,7 +1464,7 @@ has_map_fields Fail Src Size Rest=* => \
 
 ## Transform get_map_elements(s) #{ K1 := V1, K2 := V2 }
 
-get_map_elements Fail Src=xy Size=u==2 Rest=* => \
+get_map_elements Fail Src Size=u==2 Rest=* => \
     gen_get_map_element(Fail, Src, Size, Rest)
 get_map_elements Fail Src Size Rest=* | map_key_sort(Size, Rest) => \
    gen_get_map_elements(Fail, Src, Size, Rest)
@@ -1474,9 +1474,13 @@ i_get_map_elements f? s I
 i_get_map_element Fail Src=xy Key=y Dst => \
     move Key x | i_get_map_element Fail Src x Dst
 
+i_get_map_element_hash Fail Src=c Key Hash Dst => \
+    move Src x | i_get_map_element_hash Fail x Key Hash Dst
 %macro: i_get_map_element_hash GetMapElementHash -fail_action
 i_get_map_element_hash f xy c I xy
 
+i_get_map_element Fail Src=c Key Dst => \
+    move Src x | i_get_map_element Fail x Key Dst
 %macro: i_get_map_element GetMapElement -fail_action
 i_get_map_element f xy x xy
 
-- 
2.16.3