-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(<>, _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}}).