diff options
Diffstat (limited to 'lib/hipe/cerl')
-rw-r--r-- | lib/hipe/cerl/cerl_closurean.erl | 4 | ||||
-rw-r--r-- | lib/hipe/cerl/erl_bif_types.erl | 8 | ||||
-rw-r--r-- | lib/hipe/cerl/erl_types.erl | 22 |
3 files changed, 33 insertions, 1 deletions
diff --git a/lib/hipe/cerl/cerl_closurean.erl b/lib/hipe/cerl/cerl_closurean.erl index a2bd7fe0f0..583c5d624a 100644 --- a/lib/hipe/cerl/cerl_closurean.erl +++ b/lib/hipe/cerl/cerl_closurean.erl @@ -797,7 +797,8 @@ take_work({Queue0, Set0}) -> -spec is_escape_op(atom(), arity()) -> boolean(). -is_escape_op(match_fail, 1) -> false; +is_escape_op(match_fail, 1) -> false; +is_escape_op(recv_wait_timeout, 1) -> false; is_escape_op(F, A) when is_atom(F), is_integer(A) -> true. -spec is_escape_op(atom(), atom(), arity()) -> boolean(). @@ -814,6 +815,7 @@ is_escape_op(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> true. -spec is_literal_op(atom(), arity()) -> boolean(). +is_literal_op(recv_wait_timeout, 1) -> true; is_literal_op(match_fail, 1) -> true; is_literal_op(F, A) when is_atom(F), is_integer(A) -> false. diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl index 0b6db544ca..bac489c07c 100644 --- a/lib/hipe/cerl/erl_bif_types.erl +++ b/lib/hipe/cerl/erl_bif_types.erl @@ -115,6 +115,7 @@ t_map_is_key/3, t_map_entries/2, t_map_put/3, + t_map_remove/3, t_map_update/3, t_map_pairwise_merge/4 ]). @@ -1700,6 +1701,11 @@ type(maps, put, 3, Xs, Opaques) -> fun ([Key, Value, Map]) -> t_map_put({Key, Value}, Map, Opaques) end, Opaques); +type(maps, remove, 2, Xs, Opaques) -> + strict(maps, remove, 2, Xs, + fun ([Key, Map]) -> + t_map_remove(Key, Map, Opaques) + end, Opaques); type(maps, size, 1, Xs, Opaques) -> strict(maps, size, 1, Xs, fun ([Map]) -> @@ -2648,6 +2654,8 @@ arg_types(maps, merge, 2) -> [t_map(), t_map()]; arg_types(maps, put, 3) -> [t_any(), t_any(), t_map()]; +arg_types(maps, remove, 2) -> + [t_any(), t_map()]; arg_types(maps, size, 1) -> [t_map()]; arg_types(maps, update, 3) -> diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl index badf58936f..5f5612fcd3 100644 --- a/lib/hipe/cerl/erl_types.erl +++ b/lib/hipe/cerl/erl_types.erl @@ -154,6 +154,7 @@ t_map_update/2, t_map_update/3, t_map_pairwise_merge/4, t_map_put/2, t_map_put/3, + t_map_remove/3, t_matchstate/0, t_matchstate/2, t_matchstate_present/1, @@ -1925,6 +1926,27 @@ map_put({Key, Value}, ?map(Pairs,DefK,DefV), Opaques) -> end end. +-spec t_map_remove(erl_type(), erl_type(), opaques()) -> erl_type(). + +t_map_remove(Key, Map, Opaques) -> + do_opaque(Map, Opaques, fun(UM) -> map_remove(Key, UM) end). + +map_remove(_, ?none) -> ?none; +map_remove(_, ?unit) -> ?none; +map_remove(Key, Map) -> + %% ?map(lists:keydelete(Key, 1, Pairs), DefK, DefV). + case is_singleton_type(Key) of + false -> Map; + true -> + ?map(Pairs,DefK,DefV) = Map, + case lists:keyfind(Key, 1, Pairs) of + false -> Map; + {Key, _, _} -> + Pairs1 = lists:keydelete(Key, 1, Pairs), + t_map(Pairs1, DefK, DefV) + end + end. + -spec t_map_update({erl_type(), erl_type()}, erl_type()) -> erl_type(). t_map_update(KV, Map) -> |