revert last_snapshot when backtracking

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@5391 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Jacques Garrigue 2003-02-04 08:16:17 +00:00
parent 5b49f68e61
commit cca396e846
1 changed files with 7 additions and 5 deletions

View File

@ -361,7 +361,7 @@ type changes =
| Unchanged
| Invalid
type snapshot = changes ref
type snapshot = changes ref * int
let trail = Weak.create 1
let last_snapshot = ref 0
@ -391,12 +391,13 @@ let set_commu rc c =
log_change (Ccommu (rc, !rc)); rc := c
let snapshot () =
let old = !last_snapshot in
last_snapshot := !new_id;
match Weak.get trail 0 with Some r -> r
match Weak.get trail 0 with Some r -> (r, old)
| None ->
let r = ref Unchanged in
Weak.set trail 0 (Some r);
r
(r, old)
let rec rev_log accu = function
Unchanged -> accu
@ -406,13 +407,14 @@ let rec rev_log accu = function
next := Invalid;
rev_log (ch::accu) d
let backtrack changes =
let backtrack (changes, old) =
match !changes with
Unchanged -> ()
Unchanged -> last_snapshot := old
| Invalid -> failwith "Btype.backtrack"
| Change _ as change ->
cleanup_abbrev ();
let backlog = rev_log [] change in
List.iter undo_change backlog;
changes := Unchanged;
last_snapshot := old;
Weak.set trail 0 (Some changes)