| author | wenzelm | 
| Sat, 07 Sep 2013 16:33:10 +0200 | |
| changeset 53458 | ddefd18d5ed0 | 
| parent 51639 | b7f908c99546 | 
| child 53709 | 84522727f9d3 | 
| permissions | -rw-r--r-- | 
| 47980 
c81801f881b3
simplified Poly/ML setup -- 5.3.0 is now the common base-line;
 wenzelm parents: 
45666diff
changeset | 1 | (* Title: Pure/ML/ml_compiler_polyml.ML | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 2 | Author: Makarius | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 3 | |
| 50910 | 4 | Advanced runtime compilation for Poly/ML. | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 5 | *) | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 6 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 7 | structure ML_Compiler: ML_COMPILER = | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 8 | struct | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 9 | |
| 31429 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 10 | (* source locations *) | 
| 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 11 | |
| 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 12 | fun position_of (loc: PolyML.location) = | 
| 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 13 | let | 
| 50911 
ee7fe4230642
more explicit treatment of (optional) exception properties, notably for "serial" -- avoid conflict with startPosition = offset;
 wenzelm parents: 
50910diff
changeset | 14 |     val {startLine = line, startPosition = offset, endPosition = end_offset, ...} = loc;
 | 
| 
ee7fe4230642
more explicit treatment of (optional) exception properties, notably for "serial" -- avoid conflict with startPosition = offset;
 wenzelm parents: 
50910diff
changeset | 15 | val props = Exn_Properties.of_location loc; | 
| 31429 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 16 | in | 
| 43710 
7270ae921cf2
discontinued odd Position.column -- left-over from attempts at PGIP implementation;
 wenzelm parents: 
42327diff
changeset | 17 |     Position.make {line = line, offset = offset, end_offset = end_offset, props = props}
 | 
| 41484 | 18 | end; | 
| 31429 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 19 | |
| 51639 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 20 | |
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 21 | (* exn_info *) | 
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 22 | |
| 31477 | 23 | fun exn_position exn = | 
| 31429 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 24 | (case PolyML.exceptionLocation exn of | 
| 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 25 | NONE => Position.none | 
| 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 26 | | SOME loc => position_of loc); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 27 | |
| 51639 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 28 | fun pretty_exn (exn: exn) = | 
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 29 | Pretty.from_ML (pretty_ml (PolyML.prettyRepresentation (exn, get_print_depth ()))); | 
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 30 | |
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 31 | val exn_info = {exn_position = exn_position, pretty_exn = pretty_exn};
 | 
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 32 | |
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 33 | |
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 34 | (* exn_message *) | 
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 35 | |
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 36 | val exn_messages_ids = Runtime.exn_messages_ids exn_info; | 
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 37 | val exn_messages = Runtime.exn_messages exn_info; | 
| 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 38 | val exn_message = Runtime.exn_message exn_info; | 
| 31477 | 39 | |
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 40 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 41 | (* parse trees *) | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 42 | |
| 31429 
8a7c0899e0b1
convert explicitly between Position.T/PolyML.location, without costly registration of tokens;
 wenzelm parents: 
31333diff
changeset | 43 | fun report_parse_tree depth space = | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 44 | let | 
| 44737 | 45 | val reported_text = | 
| 38720 
7f8bc335e203
ML_Context.eval: produce antiquotation environment preferably in invisible context, to avoid displaced report messages from ML_Compiler;
 wenzelm parents: 
38228diff
changeset | 46 | (case Context.thread_data () of | 
| 44737 | 47 | SOME (Context.Proof ctxt) => Context_Position.reported_text ctxt | 
| 48 | | _ => Position.reported_text); | |
| 38720 
7f8bc335e203
ML_Context.eval: produce antiquotation environment preferably in invisible context, to avoid displaced report messages from ML_Compiler;
 wenzelm parents: 
38228diff
changeset | 49 | |
| 44737 | 50 | fun reported_entity kind loc decl = | 
| 51 | reported_text (position_of loc) | |
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49828diff
changeset | 52 | (Markup.entityN, (Markup.kindN, kind) :: Position.def_properties_of (position_of decl)) ""; | 
| 41503 
a7462e442e35
refined report_parse_tree: reverse reports happen to produce proper type information for inlined @{term}, @{typ} etc.;
 wenzelm parents: 
41501diff
changeset | 53 | |
| 44737 | 54 | fun reported loc (PolyML.PTtype types) = | 
| 55 | cons | |
| 56 | (PolyML.NameSpace.displayTypeExpression (types, depth, space) | |
| 57 | |> pretty_ml |> Pretty.from_ML |> Pretty.string_of | |
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49828diff
changeset | 58 | |> reported_text (position_of loc) Markup.ML_typing) | 
| 44737 | 59 | | reported loc (PolyML.PTdeclaredAt decl) = | 
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49828diff
changeset | 60 | cons (reported_entity Markup.ML_defN loc decl) | 
| 44737 | 61 | | reported loc (PolyML.PTopenedAt decl) = | 
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49828diff
changeset | 62 | cons (reported_entity Markup.ML_openN loc decl) | 
| 44737 | 63 | | reported loc (PolyML.PTstructureAt decl) = | 
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49828diff
changeset | 64 | cons (reported_entity Markup.ML_structN loc decl) | 
| 44737 | 65 | | reported _ (PolyML.PTnextSibling tree) = reported_tree (tree ()) | 
| 66 | | reported _ (PolyML.PTfirstChild tree) = reported_tree (tree ()) | |
| 67 | | reported _ _ = I | |
| 68 | and reported_tree (loc, props) = fold (reported loc) props; | |
| 69 | in fn tree => Output.report (implode (reported_tree tree [])) end; | |
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 70 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 71 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 72 | (* eval ML source tokens *) | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 73 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 74 | fun eval verbose pos toks = | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 75 | let | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 76 | val _ = Secure.secure_mltext (); | 
| 39227 | 77 | val space = ML_Env.name_space; | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 78 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 79 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 80 | (* input *) | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 81 | |
| 50911 
ee7fe4230642
more explicit treatment of (optional) exception properties, notably for "serial" -- avoid conflict with startPosition = offset;
 wenzelm parents: 
50910diff
changeset | 82 |     val location_props = op ^ (YXML.output_markup (":", #props (Position.dest pos)));
 | 
| 31437 | 83 | |
| 41501 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 84 | val input_buffer = | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 85 | Unsynchronized.ref (toks |> map | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 86 | (`(maps (String.explode o Symbol.esc) o Symbol.explode o ML_Lex.check_content_of))); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 87 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 88 | fun get () = | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 89 | (case ! input_buffer of | 
| 41501 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 90 | (c :: cs, tok) :: rest => (input_buffer := (cs, tok) :: rest; SOME c) | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 91 | | ([], _) :: rest => (input_buffer := rest; SOME #" ") | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 92 | | [] => NONE); | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 93 | |
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 94 | fun get_pos () = | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 95 | (case ! input_buffer of | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 96 | (_ :: _, tok) :: _ => ML_Lex.pos_of tok | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 97 | | ([], tok) :: _ => ML_Lex.end_pos_of tok | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 98 | | [] => Position.none); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 99 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 100 | |
| 39228 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 101 | (* output channels *) | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 102 | |
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 103 | val writeln_buffer = Unsynchronized.ref Buffer.empty; | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 104 | fun write s = Unsynchronized.change writeln_buffer (Buffer.add s); | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 105 | fun output_writeln () = writeln (Buffer.content (! writeln_buffer)); | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 106 | |
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 107 | val warnings = Unsynchronized.ref ([]: string list); | 
| 39231 
25c345302a17
avoid mixing of static and runtime errors in compiler output, to accomodate Proof General;
 wenzelm parents: 
39230diff
changeset | 108 | fun warn msg = Unsynchronized.change warnings (cons msg); | 
| 39228 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 109 | fun output_warnings () = List.app warning (rev (! warnings)); | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 110 | |
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 111 | val error_buffer = Unsynchronized.ref Buffer.empty; | 
| 39231 
25c345302a17
avoid mixing of static and runtime errors in compiler output, to accomodate Proof General;
 wenzelm parents: 
39230diff
changeset | 112 | fun err msg = Unsynchronized.change error_buffer (Buffer.add msg #> Buffer.add "\n"); | 
| 39228 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 113 | fun flush_error () = writeln (Buffer.content (! error_buffer)); | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 114 | fun raise_error msg = error (Buffer.content (Buffer.add msg (! error_buffer))); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 115 | |
| 39228 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 116 |     fun message {message = msg, hard, location = loc, context = _} =
 | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 117 | let | 
| 41504 | 118 | val pos = position_of loc; | 
| 39228 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 119 | val txt = | 
| 49828 
5631ee099293
more basic ML compiler messages -- avoid conflict of 638cefe3ee99 and cb7264721c91 concerning Protocol.message_positions;
 wenzelm parents: 
48992diff
changeset | 120 | (if hard then "ML error" else "ML warning") ^ Position.here pos ^ ":\n" ^ | 
| 
5631ee099293
more basic ML compiler messages -- avoid conflict of 638cefe3ee99 and cb7264721c91 concerning Protocol.message_positions;
 wenzelm parents: 
48992diff
changeset | 121 | Pretty.string_of (Pretty.from_ML (pretty_ml msg)); | 
| 39231 
25c345302a17
avoid mixing of static and runtime errors in compiler output, to accomodate Proof General;
 wenzelm parents: 
39230diff
changeset | 122 | in if hard then err txt else warn txt end; | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 123 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 124 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 125 | (* results *) | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 126 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 127 | val depth = get_print_depth (); | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 128 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 129 |     fun apply_result {fixes, types, signatures, structures, functors, values} =
 | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 130 | let | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 131 | fun display disp x = | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 132 | if depth > 0 then | 
| 39228 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 133 | (disp x |> pretty_ml |> Pretty.from_ML |> Pretty.string_of |> write; write "\n") | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 134 | else (); | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 135 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 136 | fun apply_fix (a, b) = | 
| 40799 
d44c87988a24
ML results: enter before printing (cf. Poly/ML SVN 1218);
 wenzelm parents: 
39507diff
changeset | 137 | (#enterFix space (a, b); display PolyML.NameSpace.displayFix (a, b)); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 138 | fun apply_type (a, b) = | 
| 40799 
d44c87988a24
ML results: enter before printing (cf. Poly/ML SVN 1218);
 wenzelm parents: 
39507diff
changeset | 139 | (#enterType space (a, b); display PolyML.NameSpace.displayType (b, depth, space)); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 140 | fun apply_sig (a, b) = | 
| 40799 
d44c87988a24
ML results: enter before printing (cf. Poly/ML SVN 1218);
 wenzelm parents: 
39507diff
changeset | 141 | (#enterSig space (a, b); display PolyML.NameSpace.displaySig (b, depth, space)); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 142 | fun apply_struct (a, b) = | 
| 40799 
d44c87988a24
ML results: enter before printing (cf. Poly/ML SVN 1218);
 wenzelm parents: 
39507diff
changeset | 143 | (#enterStruct space (a, b); display PolyML.NameSpace.displayStruct (b, depth, space)); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 144 | fun apply_funct (a, b) = | 
| 40799 
d44c87988a24
ML results: enter before printing (cf. Poly/ML SVN 1218);
 wenzelm parents: 
39507diff
changeset | 145 | (#enterFunct space (a, b); display PolyML.NameSpace.displayFunct (b, depth, space)); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 146 | fun apply_val (a, b) = | 
| 40799 
d44c87988a24
ML results: enter before printing (cf. Poly/ML SVN 1218);
 wenzelm parents: 
39507diff
changeset | 147 | (#enterVal space (a, b); display PolyML.NameSpace.displayVal (b, depth, space)); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 148 | in | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 149 | List.app apply_fix fixes; | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 150 | List.app apply_type types; | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 151 | List.app apply_sig signatures; | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 152 | List.app apply_struct structures; | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 153 | List.app apply_funct functors; | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 154 | List.app apply_val values | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 155 | end; | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 156 | |
| 39231 
25c345302a17
avoid mixing of static and runtime errors in compiler output, to accomodate Proof General;
 wenzelm parents: 
39230diff
changeset | 157 | exception STATIC_ERRORS of unit; | 
| 39230 
184507f6e8d0
ML_Compiler.eval: discontinued extra "Static Errors" of raw Poly/ML;
 wenzelm parents: 
39228diff
changeset | 158 | |
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 159 | fun result_fun (phase1, phase2) () = | 
| 31477 | 160 | ((case phase1 of | 
| 161 | NONE => () | |
| 162 | | SOME parse_tree => report_parse_tree depth space parse_tree); | |
| 163 | (case phase2 of | |
| 39231 
25c345302a17
avoid mixing of static and runtime errors in compiler output, to accomodate Proof General;
 wenzelm parents: 
39230diff
changeset | 164 | NONE => raise STATIC_ERRORS () | 
| 31477 | 165 | | SOME code => | 
| 33603 
3713a5208671
generalized Runtime.toplevel_error wrt. output function;
 wenzelm parents: 
33538diff
changeset | 166 | apply_result | 
| 
3713a5208671
generalized Runtime.toplevel_error wrt. output function;
 wenzelm parents: 
33538diff
changeset | 167 | ((code | 
| 
3713a5208671
generalized Runtime.toplevel_error wrt. output function;
 wenzelm parents: 
33538diff
changeset | 168 | |> Runtime.debugging | 
| 39231 
25c345302a17
avoid mixing of static and runtime errors in compiler output, to accomodate Proof General;
 wenzelm parents: 
39230diff
changeset | 169 | |> Runtime.toplevel_error (err o exn_message)) ()))); | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 170 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 171 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 172 | (* compiler invocation *) | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 173 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 174 | val parameters = | 
| 39228 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 175 | [PolyML.Compiler.CPOutStream write, | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 176 | PolyML.Compiler.CPNameSpace space, | 
| 39228 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 177 | PolyML.Compiler.CPErrorMessageProc message, | 
| 41501 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 178 | PolyML.Compiler.CPLineNo (the_default 0 o Position.line_of o get_pos), | 
| 
b5ad6b0d6d7c
ML compiler: more careful treatment of input tokens -- trailing space ensures proper separation and end position (cf. 82c1e348bc18, 08240feb69c7);
 wenzelm parents: 
41484diff
changeset | 179 | PolyML.Compiler.CPLineOffset (the_default 0 o Position.offset_of o get_pos), | 
| 31437 | 180 | PolyML.Compiler.CPFileName location_props, | 
| 31475 | 181 | PolyML.Compiler.CPCompilerResultFun result_fun, | 
| 182 | PolyML.Compiler.CPPrintInAlphabeticalOrder false]; | |
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 183 | val _ = | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 184 | (while not (List.null (! input_buffer)) do | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 185 | PolyML.compiler (get, parameters) ()) | 
| 39232 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 186 | handle exn => | 
| 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 187 | if Exn.is_interrupt exn then reraise exn | 
| 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 188 | else | 
| 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 189 | let | 
| 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 190 | val exn_msg = | 
| 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 191 | (case exn of | 
| 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 192 | STATIC_ERRORS () => "" | 
| 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 193 | | Runtime.TOPLEVEL_ERROR => "" | 
| 51639 
b7f908c99546
prefer pretty_exn where possible -- NB: low-level General.exnMessage may still be used elsewhere (e.g. by the ML compiler itself);
 wenzelm parents: 
50914diff
changeset | 194 | | _ => "Exception- " ^ Pretty.string_of (pretty_exn exn) ^ " raised"); | 
| 39232 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 195 | val _ = output_warnings (); | 
| 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 196 | val _ = output_writeln (); | 
| 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
39231diff
changeset | 197 | in raise_error exn_msg end; | 
| 39228 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 198 | in | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 199 | if verbose then (output_warnings (); flush_error (); output_writeln ()) | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 200 | else () | 
| 
cb7264721c91
ML_Compiler.eval: more careful printing of messages and regular output, trying to accomodate Poly/ML, Proof General, Isabelle/Scala/jEdit at the same time;
 wenzelm parents: 
39227diff
changeset | 201 | end; | 
| 31333 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 202 | |
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 203 | end; | 
| 
fcd010617e6c
added structure ML_Compiler: runtime compilation, with advanced version for Poly/ML 5.3 (formerly ML_Test);
 wenzelm parents: diff
changeset | 204 |