Source file jsooTop.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
open Js_of_ocaml_compiler
open Js_of_ocaml_compiler.Stdlib
let setup =
lazy
(Topdirs.dir_directory "/static/cmis";
Toploop.add_directive
"enable"
(Toploop.Directive_string Config.Flag.enable)
{ section = "js_of_ocaml"; doc = "Enable the given flag" };
Toploop.add_directive
"disable"
(Toploop.Directive_string Config.Flag.disable)
{ section = "js_of_ocaml"; doc = "Disable the given flag" };
Toploop.add_directive
"debug_on"
(Toploop.Directive_string Debug.enable)
{ section = "js_of_ocaml"; doc = "Enable debug for the given section" };
Toploop.add_directive
"debug_off"
(Toploop.Directive_string Debug.disable)
{ section = "js_of_ocaml"; doc = "Disable debug for the given section" };
Toploop.add_directive
"tailcall"
(Toploop.Directive_string (Config.Param.set "tc"))
{ section = "js_of_ocaml"
; doc = "Set the depth of tail calls before going through a trampoline"
})
let refill_lexbuf s p ppf buffer len =
if !p = String.length s
then 0
else
let len', nl =
try String.index_from s !p '\n' - !p + 1, false
with _ -> String.length s - !p, true
in
let len'' = min len len' in
String.blit ~src:s ~src_pos:!p ~dst:buffer ~dst_pos:0 ~len:len'';
(match ppf with
| Some ppf ->
Format.fprintf ppf "%s" (Bytes.sub_string buffer ~pos:0 ~len:len'');
if nl then Format.pp_print_newline ppf ();
Format.pp_print_flush ppf ()
| None -> ());
p := !p + len'';
len''
let use ffp content =
let fname, oc =
Filename.open_temp_file ~mode:[ Open_binary ] "jsoo_toplevel" "fake_stdin"
in
output_string oc content;
close_out oc;
try
let b = Toploop.use_silently ffp fname in
Sys.remove fname;
b
with e ->
Sys.remove fname;
raise e
[@@if ocaml_version < (4, 14, 0)]
let use ffp content = Toploop.use_silently ffp (String content)
[@@if ocaml_version >= (4, 14, 0)]
let execute printval ?pp_code ?highlight_location pp_answer s =
let lb = Lexing.from_function (refill_lexbuf s (ref 0) pp_code) in
(try
while true do
try
let phr = !Toploop.parse_toplevel_phrase lb in
let phr = JsooTopPpx.preprocess_phrase phr in
ignore (Toploop.execute_phrase printval pp_answer phr : bool)
with
| End_of_file -> raise End_of_file
| x ->
(match highlight_location with
| None -> ()
| Some f -> (
match JsooTopError.loc x with
| None -> ()
| Some loc -> f loc));
Errors.report_error Format.err_formatter x
done
with End_of_file -> ());
flush_all ()
let initialize () =
Sys.interactive := false;
Lazy.force setup;
Toploop.initialize_toplevel_env ();
Toploop.input_name := "//toplevel//";
Sys.interactive := true