diff options
author | Björn-Egil Dahlberg <[email protected]> | 2014-02-04 17:58:57 +0100 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2014-02-07 16:17:15 +0100 |
commit | c8741b7c62db3abc9dfde0fa8c7cf3d099adb347 (patch) | |
tree | 1617dc826a86da0c615165d207d73eaf62553ee1 /lib/compiler/src/v3_kernel_pp.erl | |
parent | d2c8aaef5917101c29f055cd235e604a5d9d728b (diff) | |
download | otp-c8741b7c62db3abc9dfde0fa8c7cf3d099adb347.tar.gz otp-c8741b7c62db3abc9dfde0fa8c7cf3d099adb347.tar.bz2 otp-c8741b7c62db3abc9dfde0fa8c7cf3d099adb347.zip |
compiler: Fix codegen multiple updates for Maps
This fixes an error on multiple updates optimization for map pairs.
The error was introduced with moving to term order in Maps.
This also fixes an error where register life time was lost for values
and could result in erroneuos values being emitted in for map pairs.
Simplified v3_codegen by moving multiple update optimizations to v3_kernel.
Diffstat (limited to 'lib/compiler/src/v3_kernel_pp.erl')
-rw-r--r-- | lib/compiler/src/v3_kernel_pp.erl | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/lib/compiler/src/v3_kernel_pp.erl b/lib/compiler/src/v3_kernel_pp.erl index edbd3f74f8..639c6737e2 100644 --- a/lib/compiler/src/v3_kernel_pp.erl +++ b/lib/compiler/src/v3_kernel_pp.erl @@ -110,15 +110,18 @@ format_1(#k_map{var=#k_var{}=Var,es=Es}, Ctxt) -> " | ",format_1(Var, Ctxt), $},$~ ]; -format_1(#k_map{es=Es}, Ctxt) -> - [$~,${, +format_1(#k_map{op=assoc,es=Es}, Ctxt) -> + ["~{", format_hseq(Es, ",", ctxt_bump_indent(Ctxt, 1), fun format/2), - $},$~ + "}~" + ]; +format_1(#k_map{op=exact,es=Es}, Ctxt) -> + ["::{", + format_hseq(Es, ",", ctxt_bump_indent(Ctxt, 1), fun format/2), + "}::" ]; -format_1(#k_map_pair{op=assoc,key=K,val=V}, Ctxt) -> - ["~<",format(K, Ctxt),",",format(V, Ctxt),">"]; -format_1(#k_map_pair{op=exact,key=K,val=V}, Ctxt) -> - ["::<",format(K, Ctxt),",",format(V, Ctxt),">"]; +format_1(#k_map_pair{key=K,val=V}, Ctxt) -> + ["<",format(K, Ctxt),",",format(V, Ctxt),">"]; format_1(#k_binary{segs=S}, Ctxt) -> ["#<",format(S, ctxt_bump_indent(Ctxt, 2)),">#"]; format_1(#k_bin_seg{next=Next}=S, Ctxt) -> |