aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/flags.ml11
-rw-r--r--lib/flags.mli3
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/flags.ml b/lib/flags.ml
index af40e946e9..06c52e4b26 100644
--- a/lib/flags.ml
+++ b/lib/flags.ml
@@ -14,6 +14,17 @@ let with_option o f x =
let () = o := old in
raise reraise
+let with_options ol f x =
+ let vl = List.map (!) ol in
+ let () = List.iter (fun r -> r := true) ol in
+ try
+ let r = f x in
+ let () = List.iter2 (:=) ol vl in r
+ with reraise ->
+ let reraise = Backtrace.add_backtrace reraise in
+ let () = List.iter2 (:=) ol vl in
+ raise reraise
+
let without_option o f x =
let old = !o in o:=false;
try let r = f x in o := old; r
diff --git a/lib/flags.mli b/lib/flags.mli
index 9dbe2c68c1..14b9f26bcc 100644
--- a/lib/flags.mli
+++ b/lib/flags.mli
@@ -64,6 +64,9 @@ val if_warn : ('a -> unit) -> 'a -> unit
use [with_option o (f x y) z]) *)
val with_option : bool ref -> ('a -> 'b) -> 'a -> 'b
+(** As [with_option], but on several flags. *)
+val with_options : bool ref list -> ('a -> 'b) -> 'a -> 'b
+
(** Temporarily deactivate an option *)
val without_option : bool ref -> ('a -> 'b) -> 'a -> 'b