Source file caller_id.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(** Small helper to find out who is the caller of a function *)
open! Import
module Printexc = Stdlib.Printexc
type t = Printexc.location option
let get ~skip =
let skip = __FILE__ :: skip in
let stack = Printexc.get_callstack 16 in
let len = Printexc.raw_backtrace_length stack in
let rec loop pos =
if pos = len then None
else
match
Printexc.get_raw_backtrace_slot stack pos
|> Printexc.convert_raw_backtrace_slot |> Printexc.Slot.location
with
| None -> None
| Some loc ->
if List.mem ~set:skip loc.filename then loop (pos + 1) else Some loc
in
loop 0