package stdune

  1. Overview
  2. Docs
Dune's unstable standard library

Install

Dune Dependency

Authors

Maintainers

Sources

dune-3.6.1.tbz
sha256=f1d5ac04b7a027f3d549e25cf885ebf7acc135e0291c18e6b43123a799c143ce
sha512=64714ab6155cd04bc33d693fc7a6d9d61aa7a278357eeff159df324e083914fcd556459a3945acacf1bbc3775f2232ab0c78006ab8a434dc58dcf95ffdffac52

doc/src/stdune/caller_id.ml.html

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
24
25
26
27
28
(* Small helper to find out who is the caller of a function *)

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 skip loc.filename ~equal:String.equal then loop (pos + 1)
        else
          let start : Lexing.position =
            { pos_fname = loc.filename
            ; pos_lnum = loc.line_number
            ; pos_bol = 0
            ; pos_cnum = loc.start_char
            }
          in
          let stop = { start with pos_cnum = loc.end_char } in
          Some { Loc.start; stop }
  in
  loop 0
OCaml

Innovation. Community. Security.