aboutsummaryrefslogtreecommitdiffstats
path: root/lib/debugger/src/dbg_iload.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2015-04-08 07:14:17 +0200
committerBjörn Gustavsson <[email protected]>2015-04-30 13:29:27 +0200
commit541e87f3597523cb7d71f75fe0381fddb2af0ee0 (patch)
tree2c87a8dd4b3fe8f3cd1342a50b051a74ca94579c /lib/debugger/src/dbg_iload.erl
parente8410b695f6bc431a7d16297ca31eb3c8368edf1 (diff)
downloadotp-541e87f3597523cb7d71f75fe0381fddb2af0ee0.tar.gz
otp-541e87f3597523cb7d71f75fe0381fddb2af0ee0.tar.bz2
otp-541e87f3597523cb7d71f75fe0381fddb2af0ee0.zip
debugger: Optimize evaluation of new map creation
Make sure that we recognize map literals at load time, as we do for lists and tuples. Also use maps:from_list/1 to build a new map instead of building it up from scratch inserting one key/value pair at the time.
Diffstat (limited to 'lib/debugger/src/dbg_iload.erl')
-rw-r--r--lib/debugger/src/dbg_iload.erl26
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/debugger/src/dbg_iload.erl b/lib/debugger/src/dbg_iload.erl
index d47d412893..379ffe8ce4 100644
--- a/lib/debugger/src/dbg_iload.erl
+++ b/lib/debugger/src/dbg_iload.erl
@@ -290,8 +290,7 @@ gexpr({tuple,Anno,Es0}) ->
Es1 = gexpr_list(Es0),
{tuple,ln(Anno),Es1};
gexpr({map,Anno,Fs0}) ->
- Fs1 = map_fields(Fs0, fun gexpr/1),
- {map,ln(Anno),Fs1};
+ new_map(Fs0, Anno, fun gexpr/1);
gexpr({map,Anno,E0,Fs0}) ->
E1 = gexpr(E0),
Fs1 = map_fields(Fs0, fun gexpr/1),
@@ -358,9 +357,8 @@ expr({cons,Anno,H0,T0}, _Lc) ->
expr({tuple,Anno,Es0}, _Lc) ->
Es1 = expr_list(Es0),
{tuple,ln(Anno),Es1};
-expr({map,Anno,Fs0}, _Lc) ->
- Fs1 = map_fields(Fs0),
- {map,ln(Anno),Fs1};
+expr({map,Anno,Fs}, _Lc) ->
+ new_map(Fs, Anno, fun (E) -> expr(E, false) end);
expr({map,Anno,E0,Fs0}, _Lc) ->
E1 = expr(E0, false),
Fs1 = map_fields(Fs0),
@@ -538,6 +536,24 @@ fun_clauses([{clause,A,H,G,B}|Cs]) ->
[{clause,ln(A),head(H),guard(G),exprs(B, true)}|fun_clauses(Cs)];
fun_clauses([]) -> [].
+
+new_map(Fs0, Anno, F) ->
+ Line = ln(Anno),
+ Fs1 = map_fields(Fs0, F),
+ Fs2 = [{ln(A),K,V} || {map_field_assoc,A,K,V} <- Fs1],
+ try
+ {value,Line,map_literal(Fs2, #{})}
+ catch
+ throw:not_literal ->
+ {map,Line,Fs2}
+ end.
+
+map_literal([{_,{value,_,K},{value,_,V}}|T], M) ->
+ map_literal(T, maps:put(K, V, M));
+map_literal([_|_], _) ->
+ throw(not_literal);
+map_literal([], M) -> M.
+
map_fields(Fs) ->
map_fields(Fs, fun (E) -> expr(E, false) end).