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
(* SPDX-License-Identifier: AGPL-3.0-or-later *)
(* Copyright © 2021-2026 OCamlPro *)
(* Written by the Owi programmers *)

type t =
  { ctx : Abstract_domain.Context.t
  ; stack : Abstract_stack.t
  ; locals : Abstract_value.t Abstract_locals.t
  ; func_rt : Binary.val_type list
  ; invariant : Abstract_invariant.t
  ; call_stack : int list
  }

let pp : t Fmt.t =
 fun fmt state ->
  Fmt.pf fmt "@\n  @[<v>context: %a@\nstack  : %a@\nlocals : %a@]"
    Abstract_domain.context_pretty state.ctx
    (Abstract_stack.pp state.ctx)
    state.stack
    (Fmt.list ~sep:Fmt.semi (Abstract_value.pp_with_ctx state.ctx))
    (Abstract_locals.to_list state.locals |> List.map snd)

let empty () =
  let ctx = Abstract_domain.root_context () in
  let stack = Abstract_stack.empty in
  let locals = Abstract_locals.empty in
  let func_rt = [] in
  let invariant = Abstract_invariant.empty () in
  let call_stack = [] in
  { ctx; stack; locals; func_rt; invariant; call_stack }

let empty_exec_state ~ctx ~locals =
  let invariant = Abstract_invariant.empty () in
  let stack = Abstract_stack.empty in
  let call_stack = [] in
  { ctx; stack; locals; func_rt = []; invariant; call_stack }