From e491dc2ff804107daecf36244587566210682850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Tue, 1 Oct 2013 17:52:33 +0200 Subject: compiler: Fix sorted keys in put_map instruction All pairs in a Map needs to be in strict ascending key order. --- lib/compiler/src/v3_codegen.erl | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'lib/compiler') diff --git a/lib/compiler/src/v3_codegen.erl b/lib/compiler/src/v3_codegen.erl index 667f10a7f5..e8eec08323 100644 --- a/lib/compiler/src/v3_codegen.erl +++ b/lib/compiler/src/v3_codegen.erl @@ -1501,11 +1501,18 @@ set_cg([{var,R}], {map,SrcMap,Es}, Le, Vdb, Bef, {var,SrcVar} -> fetch_var(SrcVar, Int0); _ -> SrcMap end, - List = flatmap(fun({map_pair,K,{var,V}}) -> - [K,fetch_var(V, Int0)]; - ({map_pair,K,E}) -> - [K,E] - end, sort(Es)), + + % MapPairs in put_map must be sorted in ascending Key Order + % Key literals must be unique when arriving here in v3_codegen + + SortedEs = lists:sort(fun + ({map_pair,{_T1,K1},_},{map_pair,{_T2,K2},_}) when K1 < K2 -> true; + ({map_pair,{_,_},_},{map_pair,{_,_},_}) -> false + end, Es), + List = flatmap(fun + ({map_pair,K,{var,V}}) -> [K,fetch_var(V, Int0)]; + ({map_pair,K,E}) -> [K,E] + end, SortedEs), Live = max_reg(Bef#sr.reg), Int1 = clear_dead(Int0, Le#l.i, Vdb), Aft = Bef#sr{reg=put_reg(R, Int1#sr.reg)}, -- cgit v1.2.3