diff options
author | Kostis Sagonas <[email protected]> | 2010-02-16 16:33:11 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2010-02-16 16:18:41 +0100 |
commit | abe48c24c115fd629063653eef7bdabd0f82fbbc (patch) | |
tree | 09280e163873b801da7802eb2c718d0726ab4b13 /lib/dialyzer/src | |
parent | 8b7dd064e2d44b600f05a9135aac08a539a19ffa (diff) | |
download | otp-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.
Diffstat (limited to 'lib/dialyzer/src')
-rw-r--r-- | lib/dialyzer/src/dialyzer_callgraph.erl | 29 | ||||
-rw-r--r-- | lib/dialyzer/src/dialyzer_dataflow.erl | 10 |
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( |