aboutsummaryrefslogtreecommitdiffstats
path: root/lib/dialyzer/test/map_SUITE_data/src/contract_violation.erl
blob: 850f2cad349f68c22cb013e9b1bf1ebd53c6f72e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-module(contract_violation).

-export([entry/1, beam_disasm_lines/2]).

%%-----------------------------------------------------------------------

-type lines() :: #{non_neg_integer() => {string(), non_neg_integer()}}.

entry(Bin) ->
    I = 42,
    case beam_disasm_lines(Bin, ':-)') of
	#{I := Loc} -> {good, Loc};
	_ -> bad
    end.

-spec beam_disasm_lines(binary() | none, module()) -> lines().

beam_disasm_lines(none, _) -> #{};
beam_disasm_lines(<<NumLines:32, LineBin:NumLines/binary, FileBin/binary>>,
		  _Module) ->
    Lines = binary_to_term(LineBin),
    Files = binary_to_term(FileBin),
    lines_collect_items(Lines, Files, #{}).

lines_collect_items([], _, Acc) -> Acc;
lines_collect_items([{FileNo, LineNo}|Rest], Files, Acc) ->
    #{FileNo := File} = Files,
    lines_collect_items(
      Rest, Files, Acc#{map_size(Acc)+1 => {location, File, LineNo}}).