aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler
diff options
context:
space:
mode:
authorBjörn-Egil Dahlberg <[email protected]>2014-03-17 16:53:37 +0100
committerBjörn-Egil Dahlberg <[email protected]>2014-03-17 17:47:37 +0100
commit5638ca15d05e9b05d64ade0e03492c13d020439b (patch)
tree0e06b2caf24f27dc80583fbf8cb3c42d80311d4c /lib/compiler
parentd92b9dc2aa02871a43fb23ff61dc002b47a14270 (diff)
downloadotp-5638ca15d05e9b05d64ade0e03492c13d020439b.tar.gz
otp-5638ca15d05e9b05d64ade0e03492c13d020439b.tar.bz2
otp-5638ca15d05e9b05d64ade0e03492c13d020439b.zip
compiler: Transform M#{} to is_map(M)
Core should not understand M#{} Instead transform M#{} to case _cor0 of <_cor1> when call 'erlang':'is_map' (_cor0) -> _cor1 ( <_cor2> when 'true' -> primop 'match_fail' ('badarg') -| ['compiler_generated'] ) end
Diffstat (limited to 'lib/compiler')
-rw-r--r--lib/compiler/src/v3_core.erl21
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/compiler/src/v3_core.erl b/lib/compiler/src/v3_core.erl
index bf3368c31d..082809b8a0 100644
--- a/lib/compiler/src/v3_core.erl
+++ b/lib/compiler/src/v3_core.erl
@@ -743,8 +743,25 @@ expr_map(M0,Es0,A,St0) ->
{M1,Mps,St1} = safe(M0, St0),
case is_valid_map_src(M1) of
true ->
- {Es1,Eps,St2} = map_pair_list(Es0, St1),
- {ann_c_map(A,M1,Es1),Mps++Eps,St2};
+ case {M1,Es0} of
+ {#c_var{}, []} ->
+ %% transform M#{} to is_map(M)
+ {Vpat,St2} = new_var(St1),
+ {Fpat,St3} = new_var(St2),
+ Cs = [#iclause{
+ anno=A,
+ pats=[Vpat],
+ guard=[#icall{anno=#a{anno=A},
+ module=#c_literal{anno=A,val=erlang},
+ name=#c_literal{anno=A,val=is_map},
+ args=[Vpat]}],
+ body=[Vpat]}],
+ Fc = fail_clause([Fpat], A, #c_literal{val=badarg}),
+ {#icase{anno=#a{anno=A},args=[M1],clauses=Cs,fc=Fc},Mps,St3};
+ {_,_} ->
+ {Es1,Eps,St2} = map_pair_list(Es0, St1),
+ {ann_c_map(A,M1,Es1),Mps++Eps,St2}
+ end;
false -> throw(bad_map)
end.