57
57
%%--------------------------------------------------------------------
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()}).
59
-record(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()}).
67
-opaque codeserver() :: #dialyzer_codeserver{}.
67
-opaque codeserver() :: #codeserver{}.
69
69
%%--------------------------------------------------------------------
71
71
-spec new() -> codeserver().
74
#dialyzer_codeserver{table_pid = table__new()}.
74
#codeserver{table_pid = table__new()}.
76
76
-spec delete(codeserver()) -> 'ok'.
78
delete(#dialyzer_codeserver{table_pid = TablePid}) ->
78
delete(#codeserver{table_pid = TablePid}) ->
79
79
table__delete(TablePid).
81
81
-spec insert(module(), cerl:c_module(), codeserver()) -> codeserver().
83
83
insert(Mod, ModCode, CS) ->
84
NewTablePid = table__insert(CS#dialyzer_codeserver.table_pid, Mod, ModCode),
85
CS#dialyzer_codeserver{table_pid = NewTablePid}.
84
NewTablePid = table__insert(CS#codeserver.table_pid, Mod, ModCode),
85
CS#codeserver{table_pid = NewTablePid}.
87
87
-spec insert_exports([mfa()], codeserver()) -> codeserver().
89
insert_exports(List, #dialyzer_codeserver{exports = Exports} = CS) ->
89
insert_exports(List, #codeserver{exports = Exports} = CS) ->
90
90
Set = sets:from_list(List),
91
91
NewExports = sets:union(Exports, Set),
92
CS#dialyzer_codeserver{exports = NewExports}.
92
CS#codeserver{exports = NewExports}.
94
94
-spec is_exported(mfa(), codeserver()) -> boolean().
96
is_exported(MFA, #dialyzer_codeserver{exports = Exports}) ->
96
is_exported(MFA, #codeserver{exports = Exports}) ->
97
97
sets:is_element(MFA, Exports).
99
99
-spec get_exports(codeserver()) -> set(). % set(mfa())
101
get_exports(#dialyzer_codeserver{exports = Exports}) ->
101
get_exports(#codeserver{exports = Exports}) ->
104
104
-spec lookup_mod_code(module(), codeserver()) -> cerl:c_module().
106
106
lookup_mod_code(Mod, CS) when is_atom(Mod) ->
107
table__lookup(CS#dialyzer_codeserver.table_pid, Mod).
107
table__lookup(CS#codeserver.table_pid, Mod).
109
109
-spec lookup_mfa_code(mfa(), codeserver()) -> {cerl:c_var(), cerl:c_fun()}.
111
111
lookup_mfa_code({_M, _F, _A} = MFA, CS) ->
112
table__lookup(CS#dialyzer_codeserver.table_pid, MFA).
112
table__lookup(CS#codeserver.table_pid, MFA).
114
114
-spec get_next_core_label(codeserver()) -> label().
116
get_next_core_label(#dialyzer_codeserver{next_core_label = NCL}) ->
116
get_next_core_label(#codeserver{next_core_label = NCL}) ->
119
119
-spec set_next_core_label(label(), codeserver()) -> codeserver().
121
121
set_next_core_label(NCL, CS) ->
122
CS#dialyzer_codeserver{next_core_label = NCL}.
122
CS#codeserver{next_core_label = NCL}.
124
124
-spec store_records(module(), dict(), codeserver()) -> codeserver().
126
store_records(Mod, Dict, #dialyzer_codeserver{records = RecDict} = CS)
126
store_records(Mod, Dict, #codeserver{records = RecDict} = CS)
127
127
when is_atom(Mod) ->
128
128
case dict:size(Dict) =:= 0 of
130
false -> CS#dialyzer_codeserver{records = dict:store(Mod, Dict, RecDict)}
130
false -> CS#codeserver{records = dict:store(Mod, Dict, RecDict)}
133
133
-spec lookup_mod_records(module(), codeserver()) -> dict().
135
lookup_mod_records(Mod, #dialyzer_codeserver{records = RecDict})
135
lookup_mod_records(Mod, #codeserver{records = RecDict})
136
136
when is_atom(Mod) ->
137
137
case dict:find(Mod, RecDict) of
138
138
error -> dict:new();
142
142
-spec get_records(codeserver()) -> dict().
144
get_records(#dialyzer_codeserver{records = RecDict}) ->
144
get_records(#codeserver{records = RecDict}) ->
147
147
-spec store_temp_records(module(), dict(), codeserver()) -> codeserver().
149
store_temp_records(Mod, Dict, #dialyzer_codeserver{temp_records = TempRecDict} = CS)
149
store_temp_records(Mod, Dict, #codeserver{temp_records = TempRecDict} = CS)
150
150
when is_atom(Mod) ->
151
151
case dict:size(Dict) =:= 0 of
153
false -> CS#dialyzer_codeserver{temp_records = dict:store(Mod, Dict, TempRecDict)}
153
false -> CS#codeserver{temp_records = dict:store(Mod, Dict, TempRecDict)}
156
156
-spec get_temp_records(codeserver()) -> dict().
158
get_temp_records(#dialyzer_codeserver{temp_records = TempRecDict}) ->
158
get_temp_records(#codeserver{temp_records = TempRecDict}) ->
161
161
-spec set_temp_records(dict(), codeserver()) -> codeserver().
163
163
set_temp_records(Dict, CS) ->
164
CS#dialyzer_codeserver{temp_records = Dict}.
164
CS#codeserver{temp_records = Dict}.
166
166
-spec finalize_records(dict(), codeserver()) -> codeserver().
168
168
finalize_records(Dict, CS) ->
169
CS#dialyzer_codeserver{records = Dict, temp_records = dict:new()}.
169
CS#codeserver{records = Dict, temp_records = dict:new()}.
171
171
-spec store_contracts(module(), dict(), codeserver()) -> codeserver().
173
store_contracts(Mod, Dict, #dialyzer_codeserver{contracts = C} = CS)
173
store_contracts(Mod, Dict, #codeserver{contracts = C} = CS) when is_atom(Mod) ->
175
174
case dict:size(Dict) =:= 0 of
177
false -> CS#dialyzer_codeserver{contracts = dict:store(Mod, Dict, C)}
176
false -> CS#codeserver{contracts = dict:store(Mod, Dict, C)}
180
179
-spec lookup_mod_contracts(module(), codeserver()) -> dict().
182
lookup_mod_contracts(Mod, #dialyzer_codeserver{contracts = ContDict})
181
lookup_mod_contracts(Mod, #codeserver{contracts = ContDict})
183
182
when is_atom(Mod) ->
184
183
case dict:find(Mod, ContDict) of
185
184
error -> dict:new();
198
197
-spec get_contracts(codeserver()) -> dict().
200
get_contracts(#dialyzer_codeserver{contracts = ContDict}) ->
199
get_contracts(#codeserver{contracts = ContDict}) ->
203
202
-spec store_temp_contracts(module(), dict(), codeserver()) -> codeserver().
205
store_temp_contracts(Mod, Dict, #dialyzer_codeserver{temp_contracts = C} = CS)
204
store_temp_contracts(Mod, Dict, #codeserver{temp_contracts = C} = CS)
206
205
when is_atom(Mod) ->
207
206
case dict:size(Dict) =:= 0 of
209
false -> CS#dialyzer_codeserver{temp_contracts = dict:store(Mod, Dict, C)}
208
false -> CS#codeserver{temp_contracts = dict:store(Mod, Dict, C)}
212
211
-spec get_temp_contracts(codeserver()) -> dict().
214
get_temp_contracts(#dialyzer_codeserver{temp_contracts = TempContDict}) ->
213
get_temp_contracts(#codeserver{temp_contracts = TempContDict}) ->
217
216
-spec finalize_contracts(dict(), codeserver()) -> codeserver().
219
218
finalize_contracts(Dict, CS) ->
220
CS#dialyzer_codeserver{contracts = Dict, temp_contracts = dict:new()}.
219
CS#codeserver{contracts = Dict, temp_contracts = dict:new()}.
223
222
spawn_link(fun() -> table__loop(none, dict:new()) end).