From fc17b0ed2bc905b51ed4c4ea5f13efd866bc4f80 Mon Sep 17 00:00:00 2001
From: Stavros Aronis <aronisstav@gmail.com>
Date: Wed, 5 Sep 2012 16:42:10 +0200
Subject: Remove old untested experimental extension

This extension allowed minimal detection of race conditions that were passing
through behaviour API calls, but had no tests in any suite and also caused a
crash in R15B02.
---
 lib/dialyzer/src/dialyzer_analysis_callgraph.erl |   9 +-
 lib/dialyzer/src/dialyzer_behaviours.erl         | 106 +----------------------
 lib/dialyzer/src/dialyzer_dataflow.erl           |  53 ++----------
 3 files changed, 11 insertions(+), 157 deletions(-)

(limited to 'lib/dialyzer')

diff --git a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl
index c237d4e0e9..86618a4915 100644
--- a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl
+++ b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl
@@ -326,13 +326,6 @@ cleanup_callgraph(#analysis_state{plt = InitPlt, parent = Parent,
   ModuleDeps = dialyzer_callgraph:module_deps(Callgraph),
   send_mod_deps(Parent, ModuleDeps),
   {Callgraph1, ExtCalls} = dialyzer_callgraph:remove_external(Callgraph),
-  RelevantAPICalls =
-    dialyzer_behaviours:get_behaviour_apis([gen_server]),
-  BehaviourAPICalls = [Call || {_From, To} = Call <- ExtCalls,
-			       lists:member(To, RelevantAPICalls)],
-  Callgraph2 =
-    dialyzer_callgraph:put_behaviour_api_calls(BehaviourAPICalls,
-					       Callgraph1),
   ExtCalls1 = [Call || Call = {_From, To} <- ExtCalls,
 		       not dialyzer_plt:contains_mfa(InitPlt, To)],
   {BadCalls1, RealExtCalls} =
@@ -355,7 +348,7 @@ cleanup_callgraph(#analysis_state{plt = InitPlt, parent = Parent,
      true ->
       send_ext_calls(Parent, lists:usort([To || {_From, To} <- RealExtCalls]))
   end,
-  Callgraph2.
+  Callgraph1.
 
 compile_src(File, Includes, Defines, Callgraph, CServer, UseContracts) ->
   DefaultIncludes = default_includes(filename:dirname(File)),
diff --git a/lib/dialyzer/src/dialyzer_behaviours.erl b/lib/dialyzer/src/dialyzer_behaviours.erl
index b84071b95c..36aef2a37f 100644
--- a/lib/dialyzer/src/dialyzer_behaviours.erl
+++ b/lib/dialyzer/src/dialyzer_behaviours.erl
@@ -30,11 +30,9 @@
 
 -module(dialyzer_behaviours).
 
--export([check_callbacks/5, get_behaviour_apis/1,
-	 translate_behaviour_api_call/5, translatable_behaviours/1,
-	 translate_callgraph/3]).
+-export([check_callbacks/5]).
 
--export_type([behaviour/0, behaviour_api_dict/0]).
+-export_type([behaviour/0]).
 
 %%--------------------------------------------------------------------
 
@@ -224,103 +222,3 @@ get_line([]) -> -1.
 
 get_file([{file, File}|_]) -> File;
 get_file([_|Tail]) -> get_file(Tail).
-
-%%-----------------------------------------------------------------------------
-
--spec translatable_behaviours(cerl:c_module()) -> behaviour_api_dict().
-
-translatable_behaviours(Tree) ->
-  Attrs = cerl:module_attrs(Tree),
-  {Behaviours, _BehLines} = get_behaviours(Attrs),
-  [{B, Calls} || B <- Behaviours, (Calls = behaviour_api_calls(B)) =/= []].
-
--spec get_behaviour_apis([behaviour()]) -> [mfa()].
-
-get_behaviour_apis(Behaviours) ->
-  get_behaviour_apis(Behaviours, []).
-
--spec translate_behaviour_api_call(dialyzer_callgraph:mfa_or_funlbl(),
-				   [erl_types:erl_type()],
-				   [dialyzer_races:core_vars()],
-				   module(),
-				   behaviour_api_dict()) ->
-				      {dialyzer_callgraph:mfa_or_funlbl(),
-				       [erl_types:erl_type()],
-				       [dialyzer_races:core_vars()]}
-					| 'plain_call'.
-
-translate_behaviour_api_call(_Fun, _ArgTypes, _Args, _Module, []) ->
-  plain_call;
-translate_behaviour_api_call({Module, Fun, Arity}, ArgTypes, Args,
-			     CallbackModule, BehApiInfo) ->
-  case lists:keyfind(Module, 1, BehApiInfo) of
-    false -> plain_call;
-    {Module, Calls} ->
-      case lists:keyfind({Fun, Arity}, 1, Calls) of
-	false -> plain_call;
-	{{Fun, Arity}, {CFun, CArity, COrder}} ->
-	  {{CallbackModule, CFun, CArity},
-	   [nth_or_0(N, ArgTypes, erl_types:t_any()) || N <-COrder],
-	   [nth_or_0(N, Args, bypassed) || N <-COrder]}
-      end
-  end;
-translate_behaviour_api_call(_Fun, _ArgTypes, _Args, _Module, _BehApiInfo) ->
-  plain_call.
-
--spec translate_callgraph(behaviour_api_dict(), atom(),
-			  dialyzer_callgraph:callgraph()) ->
-			     dialyzer_callgraph:callgraph().
-
-translate_callgraph([{Behaviour,_}|Behaviours], Module, Callgraph) ->
-  UsedCalls = [Call || {_From, {M, _F, _A}} = Call <-
-			 dialyzer_callgraph:get_behaviour_api_calls(Callgraph),
-		       M =:= Behaviour],
-  Calls = [{{Behaviour, API, Arity}, Callback} ||
-	    {{API, Arity}, Callback} <- behaviour_api_calls(Behaviour)],
-  DirectCalls = [{From, {Module, Fun, Arity}} ||
-		  {From, To} <- UsedCalls,{API, {Fun, Arity, _Ord}} <- Calls,
-		  To =:= API],
-  dialyzer_callgraph:add_edges(DirectCalls, Callgraph),
-  translate_callgraph(Behaviours, Module, Callgraph);
-translate_callgraph([], _Module, Callgraph) ->
-  Callgraph.
-
-get_behaviour_apis([], Acc) ->
-  Acc;
-get_behaviour_apis([Behaviour | Rest], Acc) ->
-  MFAs = [{Behaviour, Fun, Arity} ||
-	   {{Fun, Arity}, _} <- behaviour_api_calls(Behaviour)],
-  get_behaviour_apis(Rest, MFAs ++ Acc).
-
-%------------------------------------------------------------------------------
-
-nth_or_0(0, _List, Zero) ->
-  Zero;
-nth_or_0(N, List, _Zero) ->
-  lists:nth(N, List).
-
-%------------------------------------------------------------------------------
-
--type behaviour_api_dict()::[{behaviour(), behaviour_api_info()}].
--type behaviour_api_info()::[{original_fun(), replacement_fun()}].
--type original_fun()::{atom(), arity()}.
--type replacement_fun()::{atom(), arity(), arg_list()}.
--type arg_list()::[byte()].
-
--spec behaviour_api_calls(behaviour()) -> behaviour_api_info().
-
-behaviour_api_calls(gen_server) ->
-  [{{start_link, 3}, {init, 1, [2]}},
-   {{start_link, 4}, {init, 1, [3]}},
-   {{start, 3}, {init, 1, [2]}},
-   {{start, 4}, {init, 1, [3]}},
-   {{call, 2}, {handle_call, 3, [2, 0, 0]}},
-   {{call, 3}, {handle_call, 3, [2, 0, 0]}},
-   {{multi_call, 2}, {handle_call, 3, [2, 0, 0]}},
-   {{multi_call, 3}, {handle_call, 3, [3, 0, 0]}},
-   {{multi_call, 4}, {handle_call, 3, [3, 0, 0]}},
-   {{cast, 2}, {handle_cast, 2, [2, 0]}},
-   {{abcast, 2}, {handle_cast, 2, [2, 0]}},
-   {{abcast, 3}, {handle_cast, 2, [3, 0]}}];
-behaviour_api_calls(_Other) ->
-  [].
diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl
index 7131633da1..0ef008bc58 100644
--- a/lib/dialyzer/src/dialyzer_dataflow.erl
+++ b/lib/dialyzer/src/dialyzer_dataflow.erl
@@ -91,9 +91,8 @@
 		warning_mode = false :: boolean(),
 		warnings = []        :: [dial_warning()],
 		work                 :: {[_], [_], set()},
-		module               :: module(),
-		behaviour_api_dict = [] ::
-		  dialyzer_behaviours:behaviour_api_dict()}).
+		module               :: module()
+               }).
 
 -record(map, {dict = dict:new()   :: dict(),
               subst = dict:new()  :: dict(),
@@ -135,38 +134,15 @@ get_fun_types(Tree, Plt, Callgraph, Records) ->
 analyze_module(Tree, Plt, Callgraph, Records, GetWarnings) ->
   debug_pp(Tree, false),
   Module = cerl:atom_val(cerl:module_name(Tree)),
-  RaceDetection = dialyzer_callgraph:get_race_detection(Callgraph),
-  BehaviourTranslations =
-    case RaceDetection of
-      true -> dialyzer_behaviours:translatable_behaviours(Tree);
-      false -> []
-    end,
   TopFun = cerl:ann_c_fun([{label, top}], [], Tree),
-  State =
-    state__new(Callgraph, TopFun, Plt, Module, Records, BehaviourTranslations),
+  State = state__new(Callgraph, TopFun, Plt, Module, Records),
   State1 = state__race_analysis(not GetWarnings, State),
   State2 = analyze_loop(State1),
   case GetWarnings of
     true ->
       State3 = state__set_warning_mode(State2),
       State4 = analyze_loop(State3),
-
-      %% EXPERIMENTAL: Turn all behaviour API calls into calls to the
-      %%               respective callback module's functions.
-
-      case BehaviourTranslations of
-	[] -> dialyzer_races:race(State4);
-	Behaviours ->
-          Digraph = dialyzer_callgraph:get_digraph(State4#state.callgraph),
-	  TranslatedCallgraph =
-	    dialyzer_behaviours:translate_callgraph(Behaviours, Module,
-						    Callgraph),
-          St =
-            dialyzer_races:race(State4#state{callgraph = TranslatedCallgraph}),
-          FinalCallgraph = dialyzer_callgraph:put_digraph(Digraph,
-							   St#state.callgraph),
-          St#state{callgraph = FinalCallgraph}
-      end;
+      dialyzer_races:race(State4);
     false ->
       State2
   end.
@@ -530,21 +506,8 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
         Ann = cerl:get_ann(Tree),
         File = get_file(Ann),
         Line = abs(get_line(Ann)),
-
-	%% EXPERIMENTAL: Turn a behaviour's API call into a call to the
-	%%               respective callback module's function.
-
-	Module = State#state.module,
-	BehApiDict = State#state.behaviour_api_dict,
-	{RealFun, RealArgTypes, RealArgs} =
-	  case dialyzer_behaviours:translate_behaviour_api_call(Fun, ArgTypes,
-								Args, Module,
-								BehApiDict) of
-	    plain_call    -> {Fun, ArgTypes, Args};
-	    BehaviourAPI  -> BehaviourAPI
-	  end,
-        dialyzer_races:store_race_call(RealFun, RealArgTypes, RealArgs,
-				       {File, Line}, State);
+        dialyzer_races:store_race_call(Fun, ArgTypes, Args,
+                                       {File, Line}, State);
       false -> State
     end,
   FailedConj = any_none([RetWithoutLocal|NewArgTypes]),
@@ -2711,7 +2674,7 @@ determine_mode(Type, Opaques) ->
 %%%
 %%% ===========================================================================
 
-state__new(Callgraph, Tree, Plt, Module, Records, BehaviourTranslations) ->
+state__new(Callgraph, Tree, Plt, Module, Records) ->
   Opaques = erl_types:module_builtin_opaques(Module) ++
     erl_types:t_opaque_from_records(Records),
   TreeMap = build_tree_map(Tree),
@@ -2725,7 +2688,7 @@ state__new(Callgraph, Tree, Plt, Module, Records, BehaviourTranslations) ->
   #state{callgraph = Callgraph, envs = Env, fun_tab = FunTab, opaques = Opaques,
 	 plt = Plt, races = dialyzer_races:new(), records = Records,
 	 warning_mode = false, warnings = [], work = Work, tree_map = TreeMap,
-	 module = Module, behaviour_api_dict = BehaviourTranslations}.
+	 module = Module}.
 
 state__warning_mode(#state{warning_mode = WM}) ->
   WM.
-- 
cgit v1.2.3