| author | wenzelm | 
| Mon, 12 May 2014 17:17:32 +0200 | |
| changeset 56941 | 952833323c99 | 
| parent 56303 | 4cc3f4db3447 | 
| child 57666 | 1c0ee733325f | 
| permissions | -rw-r--r-- | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
1  | 
(* Title: Pure/Isar/runtime.ML  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
2  | 
Author: Makarius  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
3  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
4  | 
Isar toplevel runtime support.  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
5  | 
*)  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
7  | 
signature RUNTIME =  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
8  | 
sig  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
9  | 
exception UNDEF  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
10  | 
exception TERMINATE  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
11  | 
exception EXCURSION_FAIL of exn * string  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
12  | 
exception TOPLEVEL_ERROR  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
13  | 
val exn_context: Proof.context option -> exn -> exn  | 
| 51285 | 14  | 
type error = ((serial * string) * string option)  | 
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
15  | 
val exn_messages_ids: exn -> error list  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
16  | 
val exn_messages: exn -> (serial * string) list  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
17  | 
val exn_message: exn -> string  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
18  | 
val exn_error_message: exn -> unit  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
19  | 
val exn_trace: (unit -> 'a) -> 'a  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
20  | 
  val debugging: Context.generic option -> ('a -> 'b) -> 'a -> 'b
 | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
21  | 
  val controlled_execution: Context.generic option -> ('a -> 'b) -> 'a -> 'b
 | 
| 
33603
 
3713a5208671
generalized Runtime.toplevel_error wrt. output function;
 
wenzelm 
parents: 
32091 
diff
changeset
 | 
22  | 
  val toplevel_error: (exn -> unit) -> ('a -> 'b) -> 'a -> 'b
 | 
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
23  | 
val toplevel_program: (unit -> 'a) -> 'a  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
24  | 
val thread: bool -> (unit -> unit) -> Thread.thread  | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
25  | 
end;  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
26  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
27  | 
structure Runtime: RUNTIME =  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
28  | 
struct  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
29  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
30  | 
(** exceptions **)  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
31  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
32  | 
exception UNDEF;  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
33  | 
exception TERMINATE;  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
34  | 
exception EXCURSION_FAIL of exn * string;  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
35  | 
exception TOPLEVEL_ERROR;  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
36  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
37  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
38  | 
(* exn_context *)  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
39  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
40  | 
exception CONTEXT of Proof.context * exn;  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
41  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
42  | 
fun exn_context NONE exn = exn  | 
| 39285 | 43  | 
| exn_context (SOME ctxt) exn = if Exn.is_interrupt exn then exn else CONTEXT (ctxt, exn);  | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
44  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
45  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
46  | 
(* exn_message *)  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
47  | 
|
| 51285 | 48  | 
type error = ((serial * string) * string option);  | 
49  | 
||
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
50  | 
local  | 
| 
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
51  | 
|
| 52686 | 52  | 
fun robust f x =  | 
53  | 
(case try f x of  | 
|
54  | 
SOME s => s  | 
|
55  | 
| NONE => Markup.markup Markup.intensify "<malformed>");  | 
|
56  | 
||
57  | 
fun robust2 f x y = robust (fn () => f x y) ();  | 
|
58  | 
||
59  | 
fun robust_context NONE _ _ = []  | 
|
60  | 
| robust_context (SOME ctxt) f xs = map (robust2 f ctxt) xs;  | 
|
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
61  | 
|
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
62  | 
fun identify exn =  | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
63  | 
let  | 
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
64  | 
val exn' = Par_Exn.identify [] exn;  | 
| 
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
65  | 
val exec_id = Properties.get (Exn_Properties.get exn') Markup.exec_idN;  | 
| 
51242
 
a8e664e4fb5f
identify exceptions more robustly, to allow SML/NJ report toplevel errors without crash;
 
wenzelm 
parents: 
50914 
diff
changeset
 | 
66  | 
val i = Par_Exn.the_serial exn' handle Option.Option => serial ();  | 
| 
 
a8e664e4fb5f
identify exceptions more robustly, to allow SML/NJ report toplevel errors without crash;
 
wenzelm 
parents: 
50914 
diff
changeset
 | 
67  | 
in ((i, exn'), exec_id) end;  | 
| 
50911
 
ee7fe4230642
more explicit treatment of (optional) exception properties, notably for "serial" -- avoid conflict with startPosition = offset;
 
wenzelm 
parents: 
50505 
diff
changeset
 | 
68  | 
|
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
69  | 
fun flatten _ (CONTEXT (ctxt, exn)) = flatten (SOME ctxt) exn  | 
| 
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
70  | 
| flatten context (Exn.EXCEPTIONS exns) = maps (flatten context) exns  | 
| 
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
71  | 
| flatten context exn =  | 
| 
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
72  | 
(case Par_Exn.dest exn of  | 
| 
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
73  | 
SOME exns => maps (flatten context) exns  | 
| 
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
74  | 
| NONE => [(context, identify exn)]);  | 
| 
50911
 
ee7fe4230642
more explicit treatment of (optional) exception properties, notably for "serial" -- avoid conflict with startPosition = offset;
 
wenzelm 
parents: 
50505 
diff
changeset
 | 
75  | 
|
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
76  | 
in  | 
| 
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
77  | 
|
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
78  | 
fun exn_messages_ids e =  | 
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
79  | 
let  | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
80  | 
fun raised exn name msgs =  | 
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
81  | 
let val pos = Position.here (Exn_Output.position exn) in  | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
82  | 
(case msgs of  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
83  | 
[] => "exception " ^ name ^ " raised" ^ pos  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
84  | 
| [msg] => "exception " ^ name ^ " raised" ^ pos ^ ": " ^ msg  | 
| 51653 | 85  | 
| _ =>  | 
86  | 
            cat_lines (("exception " ^ name ^ " raised" ^ pos ^ ":") ::
 | 
|
87  | 
map (Markup.markup Markup.item) msgs))  | 
|
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
88  | 
end;  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
89  | 
|
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
90  | 
fun exn_msgs (context, ((i, exn), id)) =  | 
| 
44270
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
91  | 
(case exn of  | 
| 
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
92  | 
EXCURSION_FAIL (exn, loc) =>  | 
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
93  | 
          map (fn ((i, msg), id) => ((i, msg ^ Markup.markup Markup.no_report ("\n" ^ loc)), id))
 | 
| 
44270
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
94  | 
(sorted_msgs context exn)  | 
| 
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
95  | 
| _ =>  | 
| 
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
96  | 
let  | 
| 
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
97  | 
val msg =  | 
| 44247 | 98  | 
(case exn of  | 
| 
44270
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
99  | 
TERMINATE => "Exit"  | 
| 
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
100  | 
| TimeLimit.TimeOut => "Timeout"  | 
| 
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
101  | 
| TOPLEVEL_ERROR => "Error"  | 
| 
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
102  | 
| ERROR msg => msg  | 
| 
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
103  | 
| Fail msg => raised exn "Fail" [msg]  | 
| 44247 | 104  | 
| THEORY (msg, thys) =>  | 
| 52686 | 105  | 
raised exn "THEORY" (msg :: map (robust Context.str_of_thy) thys)  | 
| 44247 | 106  | 
| Ast.AST (msg, asts) =>  | 
| 52686 | 107  | 
raised exn "AST" (msg :: map (robust (Pretty.string_of o Ast.pretty_ast)) asts)  | 
| 44247 | 108  | 
| TYPE (msg, Ts, ts) =>  | 
| 
44270
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
109  | 
raised exn "TYPE" (msg ::  | 
| 52686 | 110  | 
(robust_context context Syntax.string_of_typ Ts @  | 
111  | 
robust_context context Syntax.string_of_term ts))  | 
|
| 44247 | 112  | 
| TERM (msg, ts) =>  | 
| 52686 | 113  | 
raised exn "TERM" (msg :: robust_context context Syntax.string_of_term ts)  | 
| 
51640
 
d022e8bd2375
improved printing of exception CTERM (see also d0f0f37ec346);
 
wenzelm 
parents: 
51639 
diff
changeset
 | 
114  | 
| CTERM (msg, cts) =>  | 
| 
 
d022e8bd2375
improved printing of exception CTERM (see also d0f0f37ec346);
 
wenzelm 
parents: 
51639 
diff
changeset
 | 
115  | 
raised exn "CTERM"  | 
| 52686 | 116  | 
(msg :: robust_context context Syntax.string_of_term (map term_of cts))  | 
| 44247 | 117  | 
| THM (msg, i, thms) =>  | 
| 
45487
 
ae60518ac054
simplified Runtime.exn_messages: always print detailed version of low-level exeptions, which should not occur in regular user errors anyway;
 
wenzelm 
parents: 
45486 
diff
changeset
 | 
118  | 
                raised exn ("THM " ^ string_of_int i)
 | 
| 52686 | 119  | 
(msg :: robust_context context Display.string_of_thm thms)  | 
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
120  | 
| _ => raised exn (robust (Pretty.string_of o Exn_Output.pretty) exn) []);  | 
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
121  | 
in [((i, msg), id)] end)  | 
| 
44270
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
122  | 
and sorted_msgs context exn =  | 
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
123  | 
sort_distinct (int_ord o pairself (fst o fst)) (maps exn_msgs (flatten context exn));  | 
| 
44270
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
124  | 
|
| 
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
125  | 
in sorted_msgs NONE e end;  | 
| 
38874
 
4a4d34d2f97b
more careful treatment of nested multi-exceptions, collapsing cumulatively empty list to Interrupt;
 
wenzelm 
parents: 
37370 
diff
changeset
 | 
126  | 
|
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
127  | 
end;  | 
| 
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
128  | 
|
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
129  | 
fun exn_messages exn = map #1 (exn_messages_ids exn);  | 
| 
50914
 
fe4714886d92
identify future results more carefully, to avoid odd duplication of error messages, notably from forked goals;
 
wenzelm 
parents: 
50911 
diff
changeset
 | 
130  | 
|
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
131  | 
fun exn_message exn =  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
132  | 
(case exn_messages exn of  | 
| 
38875
 
c7a66b584147
tuned messages: discontinued spurious full-stops (messages are occasionally composed unexpectedly);
 
wenzelm 
parents: 
38874 
diff
changeset
 | 
133  | 
[] => "Interrupt"  | 
| 
44270
 
3eaad39e520c
more careful treatment of exception serial numbers, with propagation to message channel;
 
wenzelm 
parents: 
44264 
diff
changeset
 | 
134  | 
| msgs => cat_lines (map snd msgs));  | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
135  | 
|
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
136  | 
val exn_error_message = Output.error_message o exn_message;  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
137  | 
fun exn_trace e = print_exception_trace exn_message e;  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
138  | 
|
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
139  | 
|
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
140  | 
|
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
141  | 
(** controlled execution **)  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
142  | 
|
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
143  | 
fun debugging opt_context f x =  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
144  | 
if ML_Options.exception_trace_enabled opt_context  | 
| 
53709
 
84522727f9d3
improved printing of exception trace in Poly/ML 5.5.1;
 
wenzelm 
parents: 
52686 
diff
changeset
 | 
145  | 
then print_exception_trace exn_message (fn () => f x)  | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
146  | 
else f x;  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
147  | 
|
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
148  | 
fun controlled_execution opt_context f x =  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
149  | 
(f |> debugging opt_context |> Future.interruptible_task) x;  | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
150  | 
|
| 
39238
 
7189a138dd6c
refined Runtime.toplevel_error/Document.run_command: let interrupts pass unhindered;
 
wenzelm 
parents: 
39232 
diff
changeset
 | 
151  | 
fun toplevel_error output_exn f x = f x  | 
| 
 
7189a138dd6c
refined Runtime.toplevel_error/Document.run_command: let interrupts pass unhindered;
 
wenzelm 
parents: 
39232 
diff
changeset
 | 
152  | 
handle exn =>  | 
| 
 
7189a138dd6c
refined Runtime.toplevel_error/Document.run_command: let interrupts pass unhindered;
 
wenzelm 
parents: 
39232 
diff
changeset
 | 
153  | 
if Exn.is_interrupt exn then reraise exn  | 
| 
 
7189a138dd6c
refined Runtime.toplevel_error/Document.run_command: let interrupts pass unhindered;
 
wenzelm 
parents: 
39232 
diff
changeset
 | 
154  | 
else  | 
| 
 
7189a138dd6c
refined Runtime.toplevel_error/Document.run_command: let interrupts pass unhindered;
 
wenzelm 
parents: 
39232 
diff
changeset
 | 
155  | 
let  | 
| 
45197
 
b6c527c64789
more robust toplevel_error reporting (NB: Context.proof_of on a stale theory crashes ungracefully);
 
wenzelm 
parents: 
44295 
diff
changeset
 | 
156  | 
val opt_ctxt =  | 
| 
 
b6c527c64789
more robust toplevel_error reporting (NB: Context.proof_of on a stale theory crashes ungracefully);
 
wenzelm 
parents: 
44295 
diff
changeset
 | 
157  | 
(case Context.thread_data () of  | 
| 
 
b6c527c64789
more robust toplevel_error reporting (NB: Context.proof_of on a stale theory crashes ungracefully);
 
wenzelm 
parents: 
44295 
diff
changeset
 | 
158  | 
NONE => NONE  | 
| 
 
b6c527c64789
more robust toplevel_error reporting (NB: Context.proof_of on a stale theory crashes ungracefully);
 
wenzelm 
parents: 
44295 
diff
changeset
 | 
159  | 
| SOME context => try Context.proof_of context);  | 
| 
 
b6c527c64789
more robust toplevel_error reporting (NB: Context.proof_of on a stale theory crashes ungracefully);
 
wenzelm 
parents: 
44295 
diff
changeset
 | 
160  | 
val _ = output_exn (exn_context opt_ctxt exn);  | 
| 
39238
 
7189a138dd6c
refined Runtime.toplevel_error/Document.run_command: let interrupts pass unhindered;
 
wenzelm 
parents: 
39232 
diff
changeset
 | 
161  | 
in raise TOPLEVEL_ERROR end;  | 
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
162  | 
|
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
163  | 
fun toplevel_program body =  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
164  | 
(body |> controlled_execution NONE |> toplevel_error exn_error_message) ();  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
165  | 
|
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
166  | 
(*Proof General legacy*)  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
167  | 
fun thread interrupts body =  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
168  | 
Thread.fork  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
169  | 
(((fn () => body () handle exn => if Exn.is_interrupt exn then () else reraise exn)  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
170  | 
|> debugging NONE  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
171  | 
|> toplevel_error  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
172  | 
          (fn exn => Output.urgent_message ("## INTERNAL ERROR ##\n" ^ exn_message exn))),
 | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
173  | 
Simple_Thread.attributes interrupts);  | 
| 
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56279 
diff
changeset
 | 
174  | 
|
| 
31476
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
175  | 
end;  | 
| 
 
c5d2899b6de9
moved Isar toplevel runtime support to runtime.ML, which is loaded early (before ml_compiler.ML);
 
wenzelm 
parents:  
diff
changeset
 | 
176  |