aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostis Sagonas <[email protected]>2010-02-16 16:33:11 +0200
committerBjörn Gustavsson <[email protected]>2010-02-16 16:18:41 +0100
commitabe48c24c115fd629063653eef7bdabd0f82fbbc (patch)
tree09280e163873b801da7802eb2c718d0726ab4b13
parent8b7dd064e2d44b600f05a9135aac08a539a19ffa (diff)
downloadotp-abe48c24c115fd629063653eef7bdabd0f82fbbc.tar.gz
otp-abe48c24c115fd629063653eef7bdabd0f82fbbc.tar.bz2
otp-abe48c24c115fd629063653eef7bdabd0f82fbbc.zip
dialyzer: Fix system_limit exception in race analysis
dialyzer_callgraph: Avoid creation of too many ets tables by the race analysis. dialyzer_dataflow: The digraph returned by the race analysis should not be the translated one.
-rw-r--r--lib/dialyzer/src/dialyzer_callgraph.erl29
-rw-r--r--lib/dialyzer/src/dialyzer_dataflow.erl10
2 files changed, 26 insertions, 13 deletions
diff --git a/lib/dialyzer/src/dialyzer_callgraph.erl b/lib/dialyzer/src/dialyzer_callgraph.erl
index 1f79e16449..696d504978 100644
--- a/lib/dialyzer/src/dialyzer_callgraph.erl
+++ b/lib/dialyzer/src/dialyzer_callgraph.erl
@@ -55,8 +55,8 @@
-export([cleanup/1, get_digraph/1, get_named_tables/1, get_public_tables/1,
get_race_code/1, get_race_detection/1, race_code_new/1,
- put_race_code/2, put_race_detection/2, put_named_tables/2,
- put_public_tables/2, put_behaviour_api_calls/2,
+ put_digraph/2, put_race_code/2, put_race_detection/2,
+ put_named_tables/2, put_public_tables/2, put_behaviour_api_calls/2,
get_behaviour_api_calls/1]).
-include("dialyzer.hrl").
@@ -611,15 +611,17 @@ digraph_reaching_subgraph(Funs, DG) ->
-spec cleanup(callgraph()) -> callgraph().
-cleanup(#callgraph{name_map = NameMap,
- rev_name_map = RevNameMap,
- public_tables = PublicTables,
- named_tables = NamedTables,
- race_code = RaceCode}) ->
- #callgraph{name_map = NameMap,
- rev_name_map = RevNameMap,
- public_tables = PublicTables,
- named_tables = NamedTables,
+cleanup(#callgraph{digraph = Digraph,
+ name_map = NameMap,
+ rev_name_map = RevNameMap,
+ public_tables = PublicTables,
+ named_tables = NamedTables,
+ race_code = RaceCode}) ->
+ #callgraph{digraph = Digraph,
+ name_map = NameMap,
+ rev_name_map = RevNameMap,
+ public_tables = PublicTables,
+ named_tables = NamedTables,
race_code = RaceCode}.
-spec get_digraph(callgraph()) -> digraph().
@@ -652,6 +654,11 @@ get_race_detection(#callgraph{race_detection = RD}) ->
race_code_new(Callgraph) ->
Callgraph#callgraph{race_code = dict:new()}.
+-spec put_digraph(digraph(), callgraph()) -> callgraph().
+
+put_digraph(Digraph, Callgraph) ->
+ Callgraph#callgraph{digraph = Digraph}.
+
-spec put_race_code(dict(), callgraph()) -> callgraph().
put_race_code(RaceCode, Callgraph) ->
diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl
index 7fb309497a..dada88c8bf 100644
--- a/lib/dialyzer/src/dialyzer_dataflow.erl
+++ b/lib/dialyzer/src/dialyzer_dataflow.erl
@@ -291,10 +291,16 @@ analyze_module(Tree, Plt, Callgraph, Records, GetWarnings) ->
case BehaviourTranslations of
[] -> dialyzer_races:race(State5);
Behaviours ->
+ Callgraph2 = State5#state.callgraph,
+ Digraph = dialyzer_callgraph:get_digraph(Callgraph2),
TranslatedCallgraph =
dialyzer_behaviours:translate_callgraph(Behaviours, Module,
- State5#state.callgraph),
- dialyzer_races:race(State5#state{callgraph = TranslatedCallgraph})
+ Callgraph2),
+ St =
+ dialyzer_races:race(State5#state{callgraph = TranslatedCallgraph}),
+ Callgraph3 = dialyzer_callgraph:put_digraph(Digraph,
+ St#state.callgraph),
+ St#state{callgraph = Callgraph3}
end;
false ->
state__restore_race_code(