@@ -4,23 +4,22 @@ open Caml.Format
4
4
open Bap_knowledge
5
5
open Bap_core_theory_value
6
6
open Knowledge.Syntax
7
+ open Knowledge.Let
7
8
8
9
module Value = Knowledge. Value
9
10
10
11
let package = " core"
11
12
12
- type const = Const [@@ deriving bin_io , compare , sexp ]
13
- type mut = Mut [@@ deriving bin_io , compare , sexp ]
14
13
15
- let const = Knowledge.Class. declare ~package " const-var" Const
16
- ~desc: " local immutable variables"
17
14
18
- let mut = Knowledge.Class. declare ~package " mut-var" Mut
19
- ~desc: " temporary mutable variables"
15
+ let pure = KB.Context. declare ~package " let-variables" !! Int63. zero
16
+ let temp = KB.Context. declare ~package " tmp-variables" !! Int63. zero
17
+
18
+ type id = Int63 .t [@@ deriving bin_io , compare , hash , sexp ]
20
19
21
20
type ident =
22
- | Var of {num : Int63 .t ; ver : int }
23
- | Let of {num : Int63 .t }
21
+ | Var of {num : id ; ver : int }
22
+ | Let of {num : id }
24
23
| Reg of {name : String.Caseless .t ; ver : int }
25
24
[@@ deriving bin_io , compare , hash , sexp ]
26
25
@@ -92,17 +91,25 @@ let version v = match ident v with
92
91
| Let _ -> 0
93
92
| Reg {ver} | Var {ver} -> ver
94
93
94
+ let incr var =
95
+ let * v = Knowledge.Context. get var in
96
+ let + () = Knowledge.Context. set var (Int63. succ v) in
97
+ v
98
+
95
99
let fresh s =
96
- Knowledge.Object. create mut >> | fun v ->
97
- create s (Var {num = Knowledge.Object. id v; ver= 0 })
100
+ let + num = incr pure in
101
+ create s (Var {num; ver= 0 })
102
+
103
+ let reset_temporary_counter = KB.Context. set temp Int63. zero
98
104
99
105
type 'a pure = 'a Bap_core_theory_value .t knowledge
100
106
101
107
(* we're ensuring that a variable is immutable by constraining
102
108
the scope computation to be pure. *)
103
109
let scoped : 'a sort -> ('a t -> 'b pure) -> 'b pure = fun s f ->
104
- Knowledge.Object. scoped const @@ fun v ->
105
- f @@ create s (Let {num = Knowledge.Object. id v})
110
+ let * num = Knowledge.Context. get pure in
111
+ Knowledge.Context. with_var pure (Int63. succ num) @@ fun () ->
112
+ f @@ create s (Let {num})
106
113
107
114
module Ident = struct
108
115
type t = ident [@@ deriving bin_io , compare , hash , sexp ]
0 commit comments