| author | blanchet | 
| Tue, 15 Mar 2011 15:49:42 +0100 | |
| changeset 41985 | 09b75d55008f | 
| parent 41717 | 8a1ab91df301 | 
| permissions | -rw-r--r-- | 
| 31312 | 1  | 
(* Title: Pure/ML-Systems/compiler_polyml-5.3.ML  | 
2  | 
||
| 41717 | 3  | 
Runtime compilation for Poly/ML 5.3.0 and 5.4.0.  | 
| 31312 | 4  | 
*)  | 
5  | 
||
6  | 
local  | 
|
7  | 
||
8  | 
fun drop_newline s =  | 
|
9  | 
if String.isSuffix "\n" s then String.substring (s, 0, size s - 1)  | 
|
10  | 
else s;  | 
|
11  | 
||
12  | 
in  | 
|
13  | 
||
14  | 
fun use_text ({tune_source, name_space, str_of_pos, print, error, ...}: use_context)
 | 
|
15  | 
(start_line, name) verbose txt =  | 
|
16  | 
let  | 
|
| 32738 | 17  | 
val line = Unsynchronized.ref start_line;  | 
18  | 
val in_buffer = Unsynchronized.ref (String.explode (tune_source txt));  | 
|
19  | 
val out_buffer = Unsynchronized.ref ([]: string list);  | 
|
| 31312 | 20  | 
fun output () = drop_newline (implode (rev (! out_buffer)));  | 
21  | 
||
22  | 
fun get () =  | 
|
23  | 
(case ! in_buffer of  | 
|
24  | 
[] => NONE  | 
|
| 31471 | 25  | 
| c :: cs => (in_buffer := cs; if c = #"\n" then line := ! line + 1 else (); SOME c));  | 
| 31312 | 26  | 
fun put s = out_buffer := s :: ! out_buffer;  | 
27  | 
    fun put_message {message = msg1, hard, location = {startLine = line, ...}, context} =
 | 
|
28  | 
(put (if hard then "Error: " else "Warning: ");  | 
|
29  | 
PolyML.prettyPrint (put, 76) msg1;  | 
|
30  | 
(case context of NONE => () | SOME msg2 => PolyML.prettyPrint (put, 76) msg2);  | 
|
31  | 
      put ("At" ^ str_of_pos line name ^ "\n"));
 | 
|
32  | 
||
33  | 
val parameters =  | 
|
34  | 
[PolyML.Compiler.CPOutStream put,  | 
|
| 31471 | 35  | 
PolyML.Compiler.CPNameSpace name_space,  | 
| 31312 | 36  | 
PolyML.Compiler.CPErrorMessageProc put_message,  | 
| 31471 | 37  | 
PolyML.Compiler.CPLineNo (fn () => ! line),  | 
38  | 
PolyML.Compiler.CPFileName name,  | 
|
| 31312 | 39  | 
PolyML.Compiler.CPPrintInAlphabeticalOrder false];  | 
40  | 
val _ =  | 
|
41  | 
(while not (List.null (! in_buffer)) do  | 
|
42  | 
PolyML.compiler (get, parameters) ())  | 
|
43  | 
handle exn =>  | 
|
| 
39242
 
28d3809ff91f
primitive use_text: let interrupts pass unhindered;
 
wenzelm 
parents: 
38470 
diff
changeset
 | 
44  | 
if Exn.is_interrupt exn then reraise exn  | 
| 
 
28d3809ff91f
primitive use_text: let interrupts pass unhindered;
 
wenzelm 
parents: 
38470 
diff
changeset
 | 
45  | 
else  | 
| 
 
28d3809ff91f
primitive use_text: let interrupts pass unhindered;
 
wenzelm 
parents: 
38470 
diff
changeset
 | 
46  | 
         (put ("Exception- " ^ General.exnMessage exn ^ " raised");
 | 
| 
 
28d3809ff91f
primitive use_text: let interrupts pass unhindered;
 
wenzelm 
parents: 
38470 
diff
changeset
 | 
47  | 
error (output ()); reraise exn);  | 
| 31312 | 48  | 
in if verbose then print (output ()) else () end;  | 
49  | 
||
50  | 
fun use_file context verbose name =  | 
|
51  | 
let  | 
|
52  | 
val instream = TextIO.openIn name;  | 
|
53  | 
val txt = Exn.release (Exn.capture TextIO.inputAll instream before TextIO.closeIn instream);  | 
|
54  | 
in use_text context (1, name) verbose txt end;  | 
|
55  | 
||
56  | 
end;  | 
|
57  |