@@ -31,6 +31,15 @@ module Sort = struct
31
31
32
32
and var = t option ref
33
33
34
+ (* To record changes to sorts, for use with `Types.{snapshot, backtrack}` *)
35
+ type change = var * t option
36
+
37
+ let change_log : (change -> unit) ref = ref (fun _ -> () )
38
+
39
+ let log_change change = ! change_log change
40
+
41
+ let undo_change (v , t_op ) = v := t_op
42
+
34
43
let var_name : var -> string =
35
44
let next_id = ref 1 in
36
45
let named = ref [] in
@@ -58,6 +67,11 @@ module Sort = struct
58
67
59
68
let new_var () = Var (ref None )
60
69
70
+ let set : var -> t option -> unit =
71
+ fun v t_op ->
72
+ log_change (v, t_op);
73
+ v := t_op
74
+
61
75
(* Post-condition: If the result is a [Var v], then [!v] is [None]. *)
62
76
let rec get : t -> t = function
63
77
| Const _ as t -> t
@@ -66,7 +80,7 @@ module Sort = struct
66
80
| None -> t
67
81
| Some s ->
68
82
let result = get s in
69
- if result != s then r := Some result;
83
+ if result != s then set r ( Some result) ;
70
84
(* path compression *)
71
85
result)
72
86
@@ -86,11 +100,11 @@ module Sort = struct
86
100
| Var r -> (
87
101
match ! r with
88
102
| None ->
89
- r := default_value;
103
+ set r default_value;
90
104
Value
91
105
| Some s ->
92
106
let result = get_default_value s in
93
- r := default result;
107
+ set r ( default result) ;
94
108
(* path compression *)
95
109
result)
96
110
@@ -119,7 +133,7 @@ module Sort = struct
119
133
match ! v1 with
120
134
| Some s1 -> equate_sort_const s1 c2
121
135
| None ->
122
- v1 := Some (of_const c2);
136
+ set v1 ( Some (of_const c2) );
123
137
Equal_mutated_first
124
138
125
139
and equate_var v1 s2 =
@@ -135,7 +149,7 @@ module Sort = struct
135
149
| Some s1 , _ -> swap_equate_result (equate_var v2 s1)
136
150
| _ , Some s2 -> equate_var v1 s2
137
151
| None , None ->
138
- v1 := Some (of_var v2);
152
+ set v1 ( Some (of_var v2) );
139
153
Equal_mutated_first
140
154
141
155
and equate_sort_const s1 c2 =
@@ -167,7 +181,7 @@ module Sort = struct
167
181
match ! v with
168
182
(* CR layouts v5 : this should probably default to void now * )
169
183
| None ->
170
- v := some_value;
184
+ set v some_value;
171
185
false
172
186
| Some s -> is_void_defaulting s)
173
187
| Const Value -> false
0 commit comments