Source file callsite_loc.ml
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
(** Best-effort reporting of the location of the call to Alcotest.check. *)
let check_caller caller entry =
match Printexc.backtrace_slots_of_raw_entry entry with
| Some [| slot |] -> (
match Printexc.Slot.name slot with
| Some name when caller = name -> true
| _ -> false)
| _ -> false
let get ?(__FUNCTION__ = "Alcotest_engine__Test.check") () =
let caller = __FUNCTION__ in
let open Printexc in
let callstack_depth = 3 in
let raw_backtrace = get_callstack callstack_depth in
let entries = raw_backtrace_entries raw_backtrace in
if
Array.length entries >= callstack_depth
&& check_caller caller (Array.unsafe_get entries 1)
then
match backtrace_slots_of_raw_entry (Array.unsafe_get entries 2) with
| Some [| slot |] -> (
match Slot.name slot with
| Some bound
when Alcotest_stdlib_ext.String.(
is_prefix ~affix:"Alcotest_engine__Core." bound
|| is_prefix ~affix:"Alcotest_lwt." bound
|| is_prefix ~affix:"Alcotest_async." bound
|| is_prefix ~affix:"Alcotest_mirage." bound) ->
None
| Some _ ->
Option.map
(fun { filename; line_number; start_char; _ } ->
{
Lexing.pos_fname = filename;
pos_lnum = line_number;
pos_bol = 0;
pos_cnum = start_char;
})
(Slot.location slot)
| None -> None)
| _ -> None
else None
let get ?__FUNCTION__ () =
let guess =
match Sys.getenv "ALCOTEST_SOURCE_CODE_POSITION" with
| "" | "false" | "no" | "n" | "0" -> false
| "true" | "yes" | "y" | "1" -> true
| _ | (exception _) -> true
in
if guess then get ?__FUNCTION__ () else None