aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/sys_core_fold.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2017-06-14 06:53:55 +0200
committerBjörn Gustavsson <[email protected]>2017-06-14 06:53:55 +0200
commitae27396d10508b21d1de6a7d347b98f3259fa507 (patch)
tree5d99f477c0de5701a9bb8488fb85dac5b4a8c5a2 /lib/compiler/src/sys_core_fold.erl
parent3a58b85081413df01256841e7e286828cf7e6e35 (diff)
parent4179fda36587ea42d79a7222eb358e4ca3fbcfab (diff)
downloadotp-ae27396d10508b21d1de6a7d347b98f3259fa507.tar.gz
otp-ae27396d10508b21d1de6a7d347b98f3259fa507.tar.bz2
otp-ae27396d10508b21d1de6a7d347b98f3259fa507.zip
Merge branch 'bjorn/compiler/fix-invalid-orddict'
* bjorn/compiler/fix-invalid-orddict: v3_kernel: Keep orddicts sorted sys_core_fold: Ensure that orddict keys are unique
Diffstat (limited to 'lib/compiler/src/sys_core_fold.erl')
-rw-r--r--lib/compiler/src/sys_core_fold.erl15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl
index cbf6e256f7..7acf08129a 100644
--- a/lib/compiler/src/sys_core_fold.erl
+++ b/lib/compiler/src/sys_core_fold.erl
@@ -1458,8 +1458,19 @@ sub_add_scope(Vs, #sub{s=Scope0}=Sub) ->
Sub#sub{s=Scope}.
sub_subst_scope(#sub{v=S0,s=Scope}=Sub) ->
- S = [{-1,#c_var{name=Sv}} || Sv <- cerl_sets:to_list(Scope)]++S0,
- Sub#sub{v=S}.
+ Initial = case S0 of
+ [{NegInt,_}|_] when is_integer(NegInt), NegInt < 0 ->
+ NegInt - 1;
+ _ ->
+ -1
+ end,
+ S = sub_subst_scope_1(cerl_sets:to_list(Scope), Initial, S0),
+ Sub#sub{v=orddict:from_list(S)}.
+
+%% The keys in an orddict must be unique. Make them so!
+sub_subst_scope_1([H|T], Key, Acc) ->
+ sub_subst_scope_1(T, Key-1, [{Key,#c_var{name=H}}|Acc]);
+sub_subst_scope_1([], _, Acc) -> Acc.
sub_is_val(#c_var{name=V}, #sub{v=S,s=Scope}) ->
%% When the bottleneck in sub_del_var/2 was eliminated, this