diff options
Diffstat (limited to 'lib/stdlib/src/erl_eval.erl')
-rw-r--r-- | lib/stdlib/src/erl_eval.erl | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/stdlib/src/erl_eval.erl b/lib/stdlib/src/erl_eval.erl index 2066b2f60f..aa809ab05c 100644 --- a/lib/stdlib/src/erl_eval.erl +++ b/lib/stdlib/src/erl_eval.erl @@ -501,13 +501,13 @@ find_maxline(LC) -> hide_calls(LC, MaxLine) -> LineId0 = MaxLine + 1, - {NLC, _, D} = hide(LC, LineId0, dict:new()), + {NLC, _, D} = hide(LC, LineId0, maps:new()), {NLC, D}. %% v/1 and local calls are hidden. hide({value,L,V}, Id, D) -> A = erl_anno:new(Id), - {{atom,A,ok}, Id+1, dict:store(Id, {value,L,V}, D)}; + {{atom,A,ok}, Id+1, maps:put(Id, {value,L,V}, D)}; hide({call,L,{atom,_,N}=Atom,Args}, Id0, D0) -> {NArgs, Id, D} = hide(Args, Id0, D0), C = case erl_internal:bif(N, length(Args)) of @@ -517,7 +517,7 @@ hide({call,L,{atom,_,N}=Atom,Args}, Id0, D0) -> A = erl_anno:new(Id), {call,A,{remote,L,{atom,L,m},{atom,L,f}},NArgs} end, - {C, Id+1, dict:store(Id, {call,Atom}, D)}; + {C, Id+1, maps:put(Id, {call,Atom}, D)}; hide(T0, Id0, D0) when is_tuple(T0) -> {L, Id, D} = hide(tuple_to_list(T0), Id0, D0), {list_to_tuple(L), Id, D}; @@ -532,7 +532,7 @@ unhide_calls({atom,A,ok}=E, MaxLine, D) -> L = erl_anno:line(A), if L > MaxLine -> - dict:fetch(L, D); + map_get(L, D); true -> E end; @@ -540,7 +540,7 @@ unhide_calls({call,A,{remote,L,{atom,L,m},{atom,L,f}}=F,Args}, MaxLine, D) -> Line = erl_anno:line(A), if Line > MaxLine -> - {call,Atom} = dict:fetch(Line, D), + {call,Atom} = map_get(Line, D), {call,L,Atom,unhide_calls(Args, MaxLine, D)}; true -> {call,A,F,unhide_calls(Args, MaxLine, D)} @@ -1163,9 +1163,19 @@ match1({map,_,Fs}, #{}=Map, Bs, BBs) -> match1({map,_,_}, _, _Bs, _BBs) -> throw(nomatch); match1({bin, _, Fs}, <<_/bitstring>>=B, Bs0, BBs) -> - eval_bits:match_bits(Fs, B, Bs0, BBs, - match_fun(BBs), - fun(E, Bs) -> expr(E, Bs, none, none, none) end); + EvalFun = fun(E, Bs) -> + case erl_lint:is_guard_expr(E) of + true -> ok; + false -> throw(invalid) + end, + try + expr(E, Bs, none, none, none) + catch + error:{unbound, _} -> + throw(invalid) + end + end, + eval_bits:match_bits(Fs, B, Bs0, BBs, match_fun(BBs), EvalFun); match1({bin,_,_}, _, _Bs, _BBs) -> throw(nomatch); match1({op,_,'++',{nil,_},R}, Term, Bs, BBs) -> |