that was quite the breakup
This commit is contained in:
22
bin/dune
22
bin/dune
@ -3,12 +3,28 @@
|
|||||||
(modes byte)
|
(modes byte)
|
||||||
(modules main)
|
(modules main)
|
||||||
(link_flags (-linkall))
|
(link_flags (-linkall))
|
||||||
|
(libraries topinf
|
||||||
|
tsdl
|
||||||
|
tgls.tgles2
|
||||||
|
wall
|
||||||
|
zed
|
||||||
|
irmin-unix
|
||||||
|
ocaml-compiler-libs.common
|
||||||
|
ocaml-compiler-libs.bytecomp
|
||||||
|
ocaml-compiler-libs.toplevel
|
||||||
|
findlib))
|
||||||
|
|
||||||
|
(library
|
||||||
|
(name topinf)
|
||||||
|
(modes byte)
|
||||||
|
(modules topinf)
|
||||||
(libraries tsdl
|
(libraries tsdl
|
||||||
tgls.tgles2
|
tgls.tgles2
|
||||||
wall
|
wall
|
||||||
zed
|
zed
|
||||||
irmin-unix
|
irmin-unix
|
||||||
compiler-libs.toplevel
|
|
||||||
findlib_top
|
|
||||||
ocaml-compiler-libs.common
|
ocaml-compiler-libs.common
|
||||||
ocaml-compiler-libs.toplevel))
|
ocaml-compiler-libs.bytecomp
|
||||||
|
ocaml-compiler-libs.toplevel
|
||||||
|
findlib))
|
||||||
|
|
||||||
|
|||||||
6
bin/init.ml
Normal file
6
bin/init.ml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#directory "";;
|
||||||
|
|
||||||
|
let x = 1.0;;
|
||||||
|
|
||||||
|
assert (x = 1.0)
|
||||||
|
|
||||||
116
bin/main.ml
116
bin/main.ml
@ -1,118 +1,9 @@
|
|||||||
[@@@ocaml.warning "-6-9-26-27"]
|
[@@@ocaml.warning "-6-9-26-27-32-34"]
|
||||||
|
|
||||||
open Lwt.Infix
|
open Lwt.Infix
|
||||||
module F = Fmt
|
module F = Fmt
|
||||||
module Store = Irmin_unix.Git.FS.KV (Irmin.Contents.String)
|
module Store = Irmin_unix.Git.FS.KV (Irmin.Contents.String)
|
||||||
|
|
||||||
module Topmain = struct
|
|
||||||
open Ocaml_common
|
|
||||||
open Ocaml_toplevel
|
|
||||||
module Compenv = Ocaml_common.Compenv
|
|
||||||
|
|
||||||
let read_interactive_input = ref (fun _ _ -> 0)
|
|
||||||
|
|
||||||
exception PPerror
|
|
||||||
|
|
||||||
(* Phase buffer that stores the last toplevel phrase (see [Location.input_phrase_buffer]). *)
|
|
||||||
let phrase_buffer = Buffer.create 1024
|
|
||||||
|
|
||||||
type evalenv = Format.formatter -> string -> unit
|
|
||||||
|
|
||||||
let eval lb ppf (text : string) =
|
|
||||||
F.epr "Topmain.eval: \n";
|
|
||||||
(read_interactive_input :=
|
|
||||||
fun buffer _ ->
|
|
||||||
Bytes.blit_string text 0 buffer 0 (String.length text);
|
|
||||||
Buffer.add_string phrase_buffer text;
|
|
||||||
(* Also populate the phrase buffer as new characters are added. *)
|
|
||||||
String.length text);
|
|
||||||
let snap = Btype.snapshot () in
|
|
||||||
try
|
|
||||||
F.epr "Topmain.eval: 1 reset@.";
|
|
||||||
Buffer.reset phrase_buffer;
|
|
||||||
(* Reset the phrase buffer, then flush the lexing buffer. *)
|
|
||||||
Lexing.flush_input lb;
|
|
||||||
(* calls read_interactive_input to fill buffer again *)
|
|
||||||
Location.reset ();
|
|
||||||
Warnings.reset_fatal ();
|
|
||||||
F.epr "Topmain.eval: 2 Toploop.parse_toplevel_phrase@.";
|
|
||||||
let phr =
|
|
||||||
try !Toploop.parse_toplevel_phrase lb with Exit -> raise PPerror
|
|
||||||
in
|
|
||||||
F.epr "Topmain.eval: 3 Toploop.preprocess_phrase@.";
|
|
||||||
let phr = Toploop.preprocess_phrase ppf phr in
|
|
||||||
F.epr "Topmain.eval: 4 Env.reset_cache_toplevel@.";
|
|
||||||
Env.reset_cache_toplevel ();
|
|
||||||
F.epr "Topmain.eval: 5 Toploop.execute_phrase=%b@."
|
|
||||||
(Toploop.execute_phrase true ppf phr);
|
|
||||||
F.epr "Topmain.eval: 6 handle exceptions@."
|
|
||||||
with
|
|
||||||
| End_of_file ->
|
|
||||||
F.epr "Topmain.eval End_of_file exception\n";
|
|
||||||
Btype.backtrack snap
|
|
||||||
| Sys.Break ->
|
|
||||||
F.epr "Topmain.eval Sys.Break exception\n";
|
|
||||||
F.pf ppf "Interrupted.@.";
|
|
||||||
Btype.backtrack snap
|
|
||||||
| PPerror ->
|
|
||||||
F.epr "Topmain.eval PPerror exception\n";
|
|
||||||
()
|
|
||||||
| x ->
|
|
||||||
F.epr "Topmain.eval unknown exception\n";
|
|
||||||
Location.report_exception ppf x;
|
|
||||||
Btype.backtrack snap
|
|
||||||
|
|
||||||
let preload_objects = ref [ (*"komm.cma"*) ]
|
|
||||||
|
|
||||||
let init ppf =
|
|
||||||
F.epr "Topmain.init: \n";
|
|
||||||
Clflags.include_dirs :=
|
|
||||||
List.rev_append [ Sys.getcwd () ] !Clflags.include_dirs;
|
|
||||||
(* Topdirs.dir_directory ((Sys.getcwd ()) ^ "/topfind");*)
|
|
||||||
let extra_paths =
|
|
||||||
match Sys.getenv "OCAML_TOPLEVEL_PATH" with
|
|
||||||
| exception Not_found -> []
|
|
||||||
| s -> Misc.split_path_contents s
|
|
||||||
in
|
|
||||||
Clflags.include_dirs := List.rev_append extra_paths !Clflags.include_dirs;
|
|
||||||
Compenv.readenv ppf Before_args;
|
|
||||||
Compenv.readenv ppf Before_link;
|
|
||||||
Compmisc.read_clflags_from_env ();
|
|
||||||
Toploop.set_paths ();
|
|
||||||
(try
|
|
||||||
F.epr "Load_path.get_paths: @.";
|
|
||||||
List.iter (fun s -> F.epr "\t%s\n" s) (Load_path.get_paths ());
|
|
||||||
let res =
|
|
||||||
List.for_all
|
|
||||||
(fun name ->
|
|
||||||
F.epr "Topdirs.load_file: name=%s@." name;
|
|
||||||
Topdirs.load_file ppf name)
|
|
||||||
(List.rev !preload_objects @ !Compenv.first_objfiles)
|
|
||||||
in
|
|
||||||
Toploop.run_hooks Toploop.Startup;
|
|
||||||
if not res then raise Exit
|
|
||||||
with Exit as x ->
|
|
||||||
Format.fprintf ppf "Topmain.init: Uncaught exception: %s\n"
|
|
||||||
(Printexc.to_string x));
|
|
||||||
Compmisc.init_path ();
|
|
||||||
Clflags.debug := true;
|
|
||||||
Location.formatter_for_warnings := ppf;
|
|
||||||
if not !Clflags.noversion then
|
|
||||||
F.pf ppf "OCaml version %s@.@." Config.version;
|
|
||||||
(try Toploop.initialize_toplevel_env ()
|
|
||||||
with (Env.Error _ | Typetexp.Error _) as exn ->
|
|
||||||
Location.report_exception ppf exn;
|
|
||||||
raise Exit);
|
|
||||||
let lb = Lexing.from_function (fun b l -> !read_interactive_input b l) in
|
|
||||||
Location.init lb "//toplevel//";
|
|
||||||
Location.input_name := "//toplevel//";
|
|
||||||
Location.input_lexbuf := Some lb;
|
|
||||||
Location.input_phrase_buffer := Some phrase_buffer;
|
|
||||||
Sys.catch_break true;
|
|
||||||
Toploop.run_hooks Toploop.After_setup;
|
|
||||||
eval lb
|
|
||||||
end
|
|
||||||
|
|
||||||
module Display = struct
|
module Display = struct
|
||||||
open Tgles2
|
open Tgles2
|
||||||
open Tsdl
|
open Tsdl
|
||||||
@ -659,7 +550,7 @@ let draw_storeview (r : storeview) height (s : Display.state) =
|
|||||||
type top = {
|
type top = {
|
||||||
te : textedit;
|
te : textedit;
|
||||||
res : Format.symbolic_output_buffer;
|
res : Format.symbolic_output_buffer;
|
||||||
mutable eval : Topmain.evalenv option;
|
mutable eval : Topinf.evalenv option;
|
||||||
path : string list;
|
path : string list;
|
||||||
storeview : storeview;
|
storeview : storeview;
|
||||||
}
|
}
|
||||||
@ -708,7 +599,7 @@ let draw_top (t : top) height (s : Display.state) =
|
|||||||
match t.eval with
|
match t.eval with
|
||||||
| None ->
|
| None ->
|
||||||
let e =
|
let e =
|
||||||
Topmain.init (Format.formatter_of_symbolic_output_buffer t.res)
|
Topinf.init (Format.formatter_of_symbolic_output_buffer t.res)
|
||||||
in
|
in
|
||||||
t.eval <- Some e;
|
t.eval <- Some e;
|
||||||
e
|
e
|
||||||
@ -720,6 +611,7 @@ let draw_top (t : top) height (s : Display.state) =
|
|||||||
F.epr "draw_top: previous t.res=@.";
|
F.epr "draw_top: previous t.res=@.";
|
||||||
format_symbolic_output_buffer F.stderr
|
format_symbolic_output_buffer F.stderr
|
||||||
(Format.flush_symbolic_output_buffer t.res);
|
(Format.flush_symbolic_output_buffer t.res);
|
||||||
|
Topinf.print_toplevel_value_bindings ();
|
||||||
(* HACK overwriting stdout formatter because fucking ocaml/toplevel/topdirs.ml hardcodes it *)
|
(* HACK overwriting stdout formatter because fucking ocaml/toplevel/topdirs.ml hardcodes it *)
|
||||||
Format.pp_set_formatter_out_functions Format.std_formatter
|
Format.pp_set_formatter_out_functions Format.std_formatter
|
||||||
(out_funs_of_sob t.res);
|
(out_funs_of_sob t.res);
|
||||||
|
|||||||
2427
bin/topinf.ml
Normal file
2427
bin/topinf.ml
Normal file
File diff suppressed because it is too large
Load Diff
12
bin/topinf.mli
Normal file
12
bin/topinf.mli
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
(* Accessors for the table of toplevel value bindings. These functions
|
||||||
|
must appear as first and second exported functions in this module.
|
||||||
|
(See module Translmod.) *)
|
||||||
|
val getvalue : string -> Obj.t
|
||||||
|
|
||||||
|
val setvalue : string -> Obj.t -> unit
|
||||||
|
|
||||||
|
val print_toplevel_value_bindings : unit -> unit
|
||||||
|
|
||||||
|
type evalenv = Format.formatter -> string -> unit
|
||||||
|
|
||||||
|
val init : Format.formatter -> evalenv
|
||||||
Reference in New Issue
Block a user