aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn-Egil Dahlberg <[email protected]>2015-05-14 14:55:42 +0200
committerBjörn-Egil Dahlberg <[email protected]>2015-05-21 15:44:02 +0200
commit99d4f73b20b950ce0ee1be8adf9108373d9dbbd9 (patch)
tree856e1d91b0421032490cab1c33bab8fa3e193f19
parent565d2c6fc3217b1d11e56a42d406f078b50b632c (diff)
downloadotp-99d4f73b20b950ce0ee1be8adf9108373d9dbbd9.tar.gz
otp-99d4f73b20b950ce0ee1be8adf9108373d9dbbd9.tar.bz2
otp-99d4f73b20b950ce0ee1be8adf9108373d9dbbd9.zip
beam_dict: Use Maps to map line indices
-rw-r--r--lib/compiler/src/beam_dict.erl24
1 files changed, 11 insertions, 13 deletions
diff --git a/lib/compiler/src/beam_dict.erl b/lib/compiler/src/beam_dict.erl
index aa37f2e812..e8e6fe8bab 100644
--- a/lib/compiler/src/beam_dict.erl
+++ b/lib/compiler/src/beam_dict.erl
@@ -34,7 +34,7 @@
-type atom_tab() :: #{atom() => index()}.
-type import_tab() :: gb_trees:tree(mfa(), index()).
-type fname_tab() :: gb_trees:tree(Name :: term(), index()).
--type line_tab() :: gb_trees:tree({Fname :: index(), Line :: term()}, index()).
+-type line_tab() :: #{{Fname :: index(), Line :: term()} => index()}.
-type literal_tab() :: dict:dict(Literal :: term(), index()).
-record(asm,
@@ -46,7 +46,7 @@
lambdas = [], %[{...}]
literals = dict:new() :: literal_tab(),
fnames = gb_trees:empty() :: fname_tab(),
- lines = gb_trees:empty() :: line_tab(),
+ lines = #{} :: line_tab(),
num_lines = 0 :: non_neg_integer(), %Number of line instructions
next_import = 0 :: non_neg_integer(),
string_offset = 0 :: non_neg_integer(),
@@ -175,16 +175,14 @@ line([], #asm{num_lines=N}=Dict) ->
%% No location available. Return the special pre-defined
%% index 0.
{0,Dict#asm{num_lines=N+1}};
-line([{location,Name,Line}], #asm{lines=Lines0,num_lines=N}=Dict0) ->
+line([{location,Name,Line}], #asm{lines=Lines,num_lines=N}=Dict0) ->
{FnameIndex,Dict1} = fname(Name, Dict0),
- case gb_trees:lookup({FnameIndex,Line}, Lines0) of
- {value,Index} ->
- {Index,Dict1#asm{num_lines=N+1}};
- none ->
- Index = gb_trees:size(Lines0) + 1,
- Lines = gb_trees:insert({FnameIndex,Line}, Index, Lines0),
- Dict = Dict1#asm{lines=Lines,num_lines=N+1},
- {Index,Dict}
+ Key = {FnameIndex,Line},
+ case Lines of
+ #{Key := Index} -> {Index,Dict1#asm{num_lines=N+1}};
+ _ ->
+ Index = maps:size(Lines) + 1,
+ {Index, Dict1#asm{lines=Lines#{Key=>Index},num_lines=N+1}}
end.
fname(Name, #asm{fnames=Fnames0}=Dict) ->
@@ -272,8 +270,8 @@ line_table(#asm{fnames=Fnames0,lines=Lines0,num_lines=NumLineInstrs}) ->
NumFnames = gb_trees:size(Fnames0),
Fnames1 = lists:keysort(2, gb_trees:to_list(Fnames0)),
Fnames = [Name || {Name,_} <- Fnames1],
- NumLines = gb_trees:size(Lines0),
- Lines1 = lists:keysort(2, gb_trees:to_list(Lines0)),
+ NumLines = maps:size(Lines0),
+ Lines1 = lists:keysort(2, maps:to_list(Lines0)),
Lines = [L || {L,_} <- Lines1],
{NumLineInstrs,NumFnames,Fnames,NumLines,Lines}.