added Exn.interruptible_capture, which reraises interrupts as required by user-code (when Exn.capture is not immediately followed by Exn.release);
authorwenzelm
Thu, 28 Oct 2010 21:59:01 +0200
changeset 40234 39af96cc57cb
parent 40233 b9d15110b97a
child 40235 87998864284e
added Exn.interruptible_capture, which reraises interrupts as required by user-code (when Exn.capture is not immediately followed by Exn.release); refined Exn.is_interrupt: detect nested IO Interrupts; generalized Exn.map_result; more precise dependencies;
src/Pure/General/exn.ML
src/Pure/IsaMakefile
--- a/src/Pure/General/exn.ML	Thu Oct 28 21:52:33 2010 +0200
+++ b/src/Pure/General/exn.ML	Thu Oct 28 21:59:01 2010 +0200
@@ -11,12 +11,13 @@
   val get_exn: 'a result -> exn option
   val capture: ('a -> 'b) -> 'a -> 'b result
   val release: 'a result -> 'a
-  val map_result: ('a -> 'a) -> 'a result -> 'a result
+  val map_result: ('a -> 'b) -> 'a result -> 'b result
   exception Interrupt
   val interrupt: unit -> 'a
   val is_interrupt: exn -> bool
   val interrupt_exn: 'a result
   val is_interrupt_exn: 'a result -> bool
+  val interruptible_capture: ('a -> 'b) -> 'a -> 'b result
   exception EXCEPTIONS of exn list
   val flatten: exn -> exn list
   val flatten_list: exn list -> exn list
@@ -45,7 +46,7 @@
   | release (Exn e) = reraise e;
 
 fun map_result f (Result x) = Result (f x)
-  | map_result f e = e;
+  | map_result f (Exn e) = (Exn e);
 
 
 (* interrupts *)
@@ -55,7 +56,7 @@
 fun interrupt () = raise Interrupt;
 
 fun is_interrupt Interrupt = true
-  | is_interrupt (IO.Io {cause = Interrupt, ...}) = true
+  | is_interrupt (IO.Io {cause, ...}) = is_interrupt cause
   | is_interrupt _ = false;
 
 val interrupt_exn = Exn Interrupt;
@@ -63,6 +64,9 @@
 fun is_interrupt_exn (Exn exn) = is_interrupt exn
   | is_interrupt_exn _ = false;
 
+fun interruptible_capture f x =
+  Result (f x) handle e => if is_interrupt e then reraise e else Exn e;
+
 
 (* nested exceptions *)
 
--- a/src/Pure/IsaMakefile	Thu Oct 28 21:52:33 2010 +0200
+++ b/src/Pure/IsaMakefile	Thu Oct 28 21:59:01 2010 +0200
@@ -20,6 +20,7 @@
 ## Pure
 
 BOOTSTRAP_FILES = 					\
+  General/exn.ML					\
   ML-Systems/bash.ML 					\
   ML-Systems/compiler_polyml-5.2.ML			\
   ML-Systems/compiler_polyml-5.3.ML			\
@@ -73,7 +74,6 @@
   General/basics.ML					\
   General/binding.ML					\
   General/buffer.ML					\
-  General/exn.ML					\
   General/file.ML					\
   General/graph.ML					\
   General/heap.ML					\