diff options
author | Hans Bolinder <hasse@erlang.org> | 2017-01-30 10:15:43 +0100 |
---|---|---|
committer | Hans Bolinder <hasse@erlang.org> | 2017-02-01 09:14:57 +0100 |
commit | dd297a2ccb53bd70c4b7f218eedb4ddc5593db1d (patch) | |
tree | 644214ea900d0ab1ffa335a2f40ee69984774fe7 | |
parent | 5341108ec6ba9465497c590679f35e8bef0c7b3f (diff) | |
download | otp-dd297a2ccb53bd70c4b7f218eedb4ddc5593db1d.tar.gz otp-dd297a2ccb53bd70c4b7f218eedb4ddc5593db1d.tar.bz2 otp-dd297a2ccb53bd70c4b7f218eedb4ddc5593db1d.zip |
dialyzer: Optimize typesig
dialyzer_typesig:traverse_scc() now resets the context for each
element of the SCC. Since the results of traversing the elements are
saved in the 'cmap' table, there is no need to create an SCC
conjunction. For huge SCCs this saves quite some time: the
lift_lists() function added one element at a time, which made the
calculation of deps very slow.
-rw-r--r-- | lib/dialyzer/src/dialyzer_typesig.erl | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/dialyzer/src/dialyzer_typesig.erl b/lib/dialyzer/src/dialyzer_typesig.erl index a7b55d1d79..fc1e892e28 100644 --- a/lib/dialyzer/src/dialyzer_typesig.erl +++ b/lib/dialyzer/src/dialyzer_typesig.erl @@ -209,7 +209,8 @@ traverse_scc([{M,_,_}=MFA|Left], Codeserver, DefSet, ModRecs, AccState) -> {M, Rec} = lists:keyfind(M, 1, ModRecs), TmpState1 = state__set_rec_dict(AccState, Rec), DummyLetrec = cerl:c_letrec([Def], cerl:c_atom(foo)), - {NewAccState, _} = traverse(DummyLetrec, DefSet, TmpState1), + TmpState2 = state__new_constraint_context(TmpState1), + {NewAccState, _} = traverse(DummyLetrec, DefSet, TmpState2), traverse_scc(Left, Codeserver, DefSet, ModRecs, NewAccState); traverse_scc([], _Codeserver, _DefSet, _ModRecs, AccState) -> AccState. @@ -2927,8 +2928,9 @@ state__get_rec_var(Fun, #state{fun_map = Map}) -> maps:find(Fun, Map). state__finalize(State) -> - State1 = enumerate_constraints(State), - order_fun_constraints(State1). + State1 = state__new_constraint_context(State), + State2 = enumerate_constraints(State1), + order_fun_constraints(State2). %% ============================================================================ %% |