53
57
store_temp_contracts/3]).
59
-export_type([codeserver/0]).
55
61
-include("dialyzer.hrl").
57
63
%%--------------------------------------------------------------------
59
-record(dialyzer_codeserver, {table_pid :: pid(),
60
exports = sets:new() :: set(), % set(mfa())
61
next_core_label = 0 :: label(),
62
records = dict:new() :: dict(),
63
temp_records = dict:new() :: dict(),
64
contracts = dict:new() :: dict(),
65
temp_contracts = dict:new() :: dict()}).
65
-record(codeserver, {table_pid :: pid(),
66
exported_types = sets:new() :: set(), % set(mfa())
67
temp_exported_types = sets:new() :: set(), % set(mfa())
68
exports = sets:new() :: set(), % set(mfa())
69
next_core_label = 0 :: label(),
70
records = dict:new() :: dict(),
71
temp_records = dict:new() :: dict(),
72
contracts = dict:new() :: dict(),
73
temp_contracts = dict:new() :: dict()}).
67
-opaque codeserver() :: #dialyzer_codeserver{}.
75
-opaque codeserver() :: #codeserver{}.
69
77
%%--------------------------------------------------------------------
71
79
-spec new() -> codeserver().
74
#dialyzer_codeserver{table_pid = table__new()}.
82
#codeserver{table_pid = table__new()}.
76
84
-spec delete(codeserver()) -> 'ok'.
78
delete(#dialyzer_codeserver{table_pid = TablePid}) ->
86
delete(#codeserver{table_pid = TablePid}) ->
79
87
table__delete(TablePid).
81
-spec insert(module(), cerl:c_module(), codeserver()) -> codeserver().
89
-spec insert(atom(), cerl:c_module(), codeserver()) -> codeserver().
83
91
insert(Mod, ModCode, CS) ->
84
NewTablePid = table__insert(CS#dialyzer_codeserver.table_pid, Mod, ModCode),
85
CS#dialyzer_codeserver{table_pid = NewTablePid}.
92
NewTablePid = table__insert(CS#codeserver.table_pid, Mod, ModCode),
93
CS#codeserver{table_pid = NewTablePid}.
95
-spec insert_temp_exported_types(set(), codeserver()) -> codeserver().
97
insert_temp_exported_types(Set, CS) ->
98
CS#codeserver{temp_exported_types = Set}.
87
100
-spec insert_exports([mfa()], codeserver()) -> codeserver().
89
insert_exports(List, #dialyzer_codeserver{exports = Exports} = CS) ->
102
insert_exports(List, #codeserver{exports = Exports} = CS) ->
90
103
Set = sets:from_list(List),
91
104
NewExports = sets:union(Exports, Set),
92
CS#dialyzer_codeserver{exports = NewExports}.
105
CS#codeserver{exports = NewExports}.
94
107
-spec is_exported(mfa(), codeserver()) -> boolean().
96
is_exported(MFA, #dialyzer_codeserver{exports = Exports}) ->
109
is_exported(MFA, #codeserver{exports = Exports}) ->
97
110
sets:is_element(MFA, Exports).
112
-spec get_exported_types(codeserver()) -> set(). % set(mfa())
114
get_exported_types(#codeserver{exported_types = ExpTypes}) ->
117
-spec get_temp_exported_types(codeserver()) -> set().
119
get_temp_exported_types(#codeserver{temp_exported_types = TempExpTypes}) ->
99
122
-spec get_exports(codeserver()) -> set(). % set(mfa())
101
get_exports(#dialyzer_codeserver{exports = Exports}) ->
124
get_exports(#codeserver{exports = Exports}) ->
104
-spec lookup_mod_code(module(), codeserver()) -> cerl:c_module().
127
-spec finalize_exported_types(set(), codeserver()) -> codeserver().
129
finalize_exported_types(Set, CS) ->
130
CS#codeserver{exported_types = Set, temp_exported_types = sets:new()}.
132
-spec lookup_mod_code(atom(), codeserver()) -> cerl:c_module().
106
134
lookup_mod_code(Mod, CS) when is_atom(Mod) ->
107
table__lookup(CS#dialyzer_codeserver.table_pid, Mod).
135
table__lookup(CS#codeserver.table_pid, Mod).
109
137
-spec lookup_mfa_code(mfa(), codeserver()) -> {cerl:c_var(), cerl:c_fun()}.
111
139
lookup_mfa_code({_M, _F, _A} = MFA, CS) ->
112
table__lookup(CS#dialyzer_codeserver.table_pid, MFA).
140
table__lookup(CS#codeserver.table_pid, MFA).
114
142
-spec get_next_core_label(codeserver()) -> label().
116
get_next_core_label(#dialyzer_codeserver{next_core_label = NCL}) ->
144
get_next_core_label(#codeserver{next_core_label = NCL}) ->
119
147
-spec set_next_core_label(label(), codeserver()) -> codeserver().
121
149
set_next_core_label(NCL, CS) ->
122
CS#dialyzer_codeserver{next_core_label = NCL}.
124
-spec store_records(module(), dict(), codeserver()) -> codeserver().
126
store_records(Mod, Dict, #dialyzer_codeserver{records = RecDict} = CS)
150
CS#codeserver{next_core_label = NCL}.
152
-spec store_records(atom(), dict(), codeserver()) -> codeserver().
154
store_records(Mod, Dict, #codeserver{records = RecDict} = CS)
127
155
when is_atom(Mod) ->
128
156
case dict:size(Dict) =:= 0 of
130
false -> CS#dialyzer_codeserver{records = dict:store(Mod, Dict, RecDict)}
158
false -> CS#codeserver{records = dict:store(Mod, Dict, RecDict)}
133
-spec lookup_mod_records(module(), codeserver()) -> dict().
161
-spec lookup_mod_records(atom(), codeserver()) -> dict().
135
lookup_mod_records(Mod, #dialyzer_codeserver{records = RecDict})
163
lookup_mod_records(Mod, #codeserver{records = RecDict})
136
164
when is_atom(Mod) ->
137
165
case dict:find(Mod, RecDict) of
138
166
error -> dict:new();
139
167
{ok, Dict} -> Dict
142
-spec get_records(codeserver()) -> dict().
170
-spec get_records(codeserver()) -> dict().
144
get_records(#dialyzer_codeserver{records = RecDict}) ->
172
get_records(#codeserver{records = RecDict}) ->
147
-spec store_temp_records(module(), dict(), codeserver()) -> codeserver().
175
-spec store_temp_records(atom(), dict(), codeserver()) -> codeserver().
149
store_temp_records(Mod, Dict, #dialyzer_codeserver{temp_records = TempRecDict} = CS)
177
store_temp_records(Mod, Dict, #codeserver{temp_records = TempRecDict} = CS)
150
178
when is_atom(Mod) ->
151
179
case dict:size(Dict) =:= 0 of
153
false -> CS#dialyzer_codeserver{temp_records = dict:store(Mod, Dict, TempRecDict)}
181
false -> CS#codeserver{temp_records = dict:store(Mod, Dict, TempRecDict)}
156
-spec get_temp_records(codeserver()) -> dict().
184
-spec get_temp_records(codeserver()) -> dict().
158
get_temp_records(#dialyzer_codeserver{temp_records = TempRecDict}) ->
186
get_temp_records(#codeserver{temp_records = TempRecDict}) ->
161
189
-spec set_temp_records(dict(), codeserver()) -> codeserver().
163
191
set_temp_records(Dict, CS) ->
164
CS#dialyzer_codeserver{temp_records = Dict}.
192
CS#codeserver{temp_records = Dict}.
166
-spec finalize_records(dict(), codeserver()) -> codeserver().
194
-spec finalize_records(dict(), codeserver()) -> codeserver().
168
196
finalize_records(Dict, CS) ->
169
CS#dialyzer_codeserver{records = Dict, temp_records = dict:new()}.
171
-spec store_contracts(module(), dict(), codeserver()) -> codeserver().
173
store_contracts(Mod, Dict, #dialyzer_codeserver{contracts = C} = CS)
197
CS#codeserver{records = Dict, temp_records = dict:new()}.
199
-spec store_contracts(atom(), dict(), codeserver()) -> codeserver().
201
store_contracts(Mod, Dict, #codeserver{contracts = C} = CS) when is_atom(Mod) ->
175
202
case dict:size(Dict) =:= 0 of
177
false -> CS#dialyzer_codeserver{contracts = dict:store(Mod, Dict, C)}
204
false -> CS#codeserver{contracts = dict:store(Mod, Dict, C)}
180
-spec lookup_mod_contracts(module(), codeserver()) -> dict().
207
-spec lookup_mod_contracts(atom(), codeserver()) -> dict().
182
lookup_mod_contracts(Mod, #dialyzer_codeserver{contracts = ContDict})
209
lookup_mod_contracts(Mod, #codeserver{contracts = ContDict})
183
210
when is_atom(Mod) ->
184
211
case dict:find(Mod, ContDict) of
185
212
error -> dict:new();
186
213
{ok, Dict} -> Dict
189
-spec lookup_mfa_contract(mfa(), codeserver()) ->
216
-spec lookup_mfa_contract(mfa(), codeserver()) ->
190
217
'error' | {'ok', dialyzer_contracts:file_contract()}.
192
lookup_mfa_contract({M,_F,_A} = MFA, #dialyzer_codeserver{contracts = ContDict}) ->
219
lookup_mfa_contract({M,_F,_A} = MFA, #codeserver{contracts = ContDict}) ->
193
220
case dict:find(M, ContDict) of
195
222
{ok, Dict} -> dict:find(MFA, Dict)
198
-spec get_contracts(codeserver()) -> dict().
225
-spec get_contracts(codeserver()) -> dict().
200
get_contracts(#dialyzer_codeserver{contracts = ContDict}) ->
227
get_contracts(#codeserver{contracts = ContDict}) ->
203
-spec store_temp_contracts(module(), dict(), codeserver()) -> codeserver().
230
-spec store_temp_contracts(atom(), dict(), codeserver()) -> codeserver().
205
store_temp_contracts(Mod, Dict, #dialyzer_codeserver{temp_contracts = C} = CS)
232
store_temp_contracts(Mod, Dict, #codeserver{temp_contracts = C} = CS)
206
233
when is_atom(Mod) ->
207
234
case dict:size(Dict) =:= 0 of
209
false -> CS#dialyzer_codeserver{temp_contracts = dict:store(Mod, Dict, C)}
236
false -> CS#codeserver{temp_contracts = dict:store(Mod, Dict, C)}
212
239
-spec get_temp_contracts(codeserver()) -> dict().
214
get_temp_contracts(#dialyzer_codeserver{temp_contracts = TempContDict}) ->
241
get_temp_contracts(#codeserver{temp_contracts = TempContDict}) ->
217
244
-spec finalize_contracts(dict(), codeserver()) -> codeserver().
219
246
finalize_contracts(Dict, CS) ->
220
CS#dialyzer_codeserver{contracts = Dict, temp_contracts = dict:new()}.
247
CS#codeserver{contracts = Dict, temp_contracts = dict:new()}.
223
250
spawn_link(fun() -> table__loop(none, dict:new()) end).