diff --git a/src/backend/handlePdf.ml b/src/backend/handlePdf.ml index bfeaf83a8..7f312220a 100644 --- a/src/backend/handlePdf.ml +++ b/src/backend/handlePdf.ml @@ -8,8 +8,16 @@ open HorzBox type t = | PDF of Pdf.t * Pdfpage.t Alist.t * abs_path +type config = { + debug_show_bbox : bool; + debug_show_space : bool; + debug_show_block_bbox : bool; + debug_show_block_space : bool; + debug_show_overfull : bool; +} type 'o op_funcs = { + config : config; graphics : (intermediate_horz_box list) GraphicD.t -> (point -> intermediate_horz_box list -> 'o list) -> 'o list; text : horz_string_info -> point -> OutputText.t -> 'o list; math : math_string_info -> point -> OutputText.t -> 'o list; @@ -39,7 +47,8 @@ let pdfops_of_image imgkey pt wid hgt = GraphicD.pdfops_of_image pt xratio yratio tag -let fs_pdf = { +let fs_pdf (config : config) = { + config = config; graphics = GraphicD.to_pdfops; text = pdfops_of_text; math = pdfops_of_math; @@ -67,7 +76,7 @@ let warn_ratios (fs : 'o op_funcs) (pbinfo : page_break_info) pt hgt dpt (ratios match ratios with | TooLong{ required = wid_required; actual = wid_actual } -> Logging.warn_overfull_line pageno; - if OptionState.does_debug_show_overfull () then + if fs.config.debug_show_overfull then List.append (fs.test_frame color_show_overfull pt wid_actual hgt dpt) (fs.test_frame color_show_overfull pt wid_required hgt dpt) @@ -76,7 +85,7 @@ let warn_ratios (fs : 'o op_funcs) (pbinfo : page_break_info) pt hgt dpt (ratios | TooShort{ required = wid_required; actual = wid_actual } -> Logging.warn_underfull_line pageno; - if OptionState.does_debug_show_overfull () then + if fs.config.debug_show_overfull then List.append (fs.test_frame color_show_overfull pt wid_actual hgt dpt) (fs.test_frame color_show_overfull pt wid_required hgt dpt) @@ -91,7 +100,7 @@ let warn_reachability (fs : 'o op_funcs) (pbinfo : page_break_info) pt hgt dpt ( match reach with | Unreachable -> Logging.warn_unreachable pbinfo.current_page_number; - if OptionState.does_debug_show_overfull () then + if fs.config.debug_show_overfull then let wid = Length.of_pdf_point 2. in (* temporary *) fs.test_frame color_show_unreachable pt wid hgt dpt else @@ -112,7 +121,7 @@ let rec ops_of_evaled_horz_box (fs : 'o op_funcs) (pbinfo : page_break_info) ypo match evhbmain with | EvHorzEmpty -> let opaccnew = - if OptionState.does_debug_show_space () then + if fs.config.debug_show_space then let opsgr = fs.test_box color_show_space (xpos, yposbaseline) wid (Length.of_pdf_point 2.) in Alist.append opacc opsgr else @@ -143,7 +152,7 @@ let rec ops_of_evaled_horz_box (fs : 'o op_funcs) (pbinfo : page_break_info) ypo let opsmain = fs.text hsinfo (xpos, yposbaseline +% hsinfo.rising) otxt in - if OptionState.does_debug_show_bbox () then + if fs.config.debug_show_bbox then let opsgr = fs.test_frame color_show_bbox (xpos, yposbaseline) wid hgt dpt in List.append opsgr opsmain else @@ -157,7 +166,7 @@ let rec ops_of_evaled_horz_box (fs : 'o op_funcs) (pbinfo : page_break_info) ypo let opsmain = fs.math msinfo (xpos, yposbaseline) otxt in - if OptionState.does_debug_show_bbox () then + if fs.config.debug_show_bbox then let opsgr = fs.test_frame color_show_bbox (xpos, yposbaseline) wid hgt dpt in List.append opsgr opsmain else @@ -172,7 +181,7 @@ let rec ops_of_evaled_horz_box (fs : 'o op_funcs) (pbinfo : page_break_info) ypo in let opaccnew = (* - if OptionState.does_debug_show_bbox () then + if fs.config.debug_show_bbox then Alist.append opaccsub (GraphicD.pdfops_test_frame (xpos, yposbaseline) wid hgt dpt) else *) @@ -193,7 +202,7 @@ let rec ops_of_evaled_horz_box (fs : 'o op_funcs) (pbinfo : page_break_info) ypo let opsgr = pdfops_of_graphics fs pbinfo gr in let opaccsub = Alist.append opacc opsgr in let opaccnew = - if OptionState.does_debug_show_bbox () then + if fs.config.debug_show_bbox then let opsgr = fs.test_frame color_show_bbox (xpos, yposbaseline) wid hgt dpt in Alist.append opaccsub opsgr else @@ -297,7 +306,7 @@ and ops_of_evaled_vert_box_list (fs : 'o op_funcs) pbinfo (xinit, yinit) opaccin match evvb with | EvVertFixedEmpty(debug_margins, vskip) -> let opacc = - if OptionState.does_debug_show_block_space () then + if fs.config.debug_show_block_space then let ops = match debug_margins with | Fixed -> fs.test_skip_fixed color_show_skip pos vskip @@ -321,7 +330,7 @@ and ops_of_evaled_vert_box_list (fs : 'o op_funcs) pbinfo (xinit, yinit) opaccin evhblst @|> (xpos, opacc) @|> List.fold_left (ops_of_evaled_horz_box fs pbinfo yposbaseline) in let opaccend = - if OptionState.does_debug_show_block_bbox () then + if fs.config.debug_show_block_bbox then let wid = xposlast -% xpos in Alist.append opaccend (fs.test_frame color_show_block_bbox (xpos, yposbaseline) wid hgt dpt) else @@ -376,25 +385,26 @@ let get_paper_height (paper : Pdfpaper.t) : length = let opacc_of_body_and_footnote + (config : config) (txtlen : length) (* -- for option `--debug-show-block-bbox` -- *) (pbinfo : page_break_info) ((ptbody, evvblstbody) : (length * length) * evaled_vert_box list) ((ptfootnote, evvblstfootnote) : (length * length) * evaled_vert_box list) : Pdfops.t Alist.t = - + let fs = fs_pdf config in let opaccbody = - let (_, opaccbody) = ops_of_evaled_vert_box_list fs_pdf pbinfo ptbody Alist.empty evvblstbody in - if OptionState.does_debug_show_block_bbox () then - Alist.append opaccbody (fs_pdf.test_scale color_show_frame ptbody txtlen) + let (_, opaccbody) = ops_of_evaled_vert_box_list fs pbinfo ptbody Alist.empty evvblstbody in + if config.debug_show_block_bbox then + Alist.append opaccbody (fs.test_scale color_show_frame ptbody txtlen) else opaccbody in let opaccfootnote = - let (_, opaccfootnote) = ops_of_evaled_vert_box_list fs_pdf pbinfo ptfootnote Alist.empty evvblstfootnote in - if OptionState.does_debug_show_block_bbox () then + let (_, opaccfootnote) = ops_of_evaled_vert_box_list fs pbinfo ptfootnote Alist.empty evvblstfootnote in + if fs.config.debug_show_block_bbox then let wid = Length.of_pdf_point 5. in let len = Length.of_pdf_point 1. in - Alist.append opaccfootnote (fs_pdf.test_box color_show_frame ptfootnote wid len) + Alist.append opaccfootnote (fs.test_box color_show_frame ptfootnote wid len) else opaccfootnote in @@ -425,6 +435,7 @@ let make_empty_page let add_column_to_page + (config : config) (Page(paper, pagecontsch, opacc, pbinfo)) (origin_shift : length) (evvblstbody : evaled_vert_box list) @@ -449,25 +460,26 @@ let add_column_to_page content_origin evvblstfootnote in - opacc_of_body_and_footnote content_height pbinfo + opacc_of_body_and_footnote config content_height pbinfo (posbody, evvblstbody) (posfootnote, evvblstfootnote) in Page(paper, pagecontsch, Alist.cat opacc opacccolumn, pbinfo) -let write_page (Page(paper, _pagecontsch, opaccpage, pbinfo) : page) (pagepartsf : page_parts_scheme_func) ((PDF(pdf, pageacc, flnm)) : t) : t = +let write_page (config : config) (Page(paper, _pagecontsch, opaccpage, pbinfo) : page) (pagepartsf : page_parts_scheme_func) ((PDF(pdf, pageacc, flnm)) : t) : t = + let fs = fs_pdf config in let paper_height = get_paper_height paper in let pagepartssch = pagepartsf pbinfo in (* -- invokes the page-parts function -- *) let (evvblst_header, _) = pagepartssch.header_content |> PageInfo.embed_page_info_vert pbinfo in let pt_header = invert_coordinate paper_height pagepartssch.header_origin in - let (_, opacc_header) = ops_of_evaled_vert_box_list fs_pdf pbinfo pt_header opaccpage evvblst_header in + let (_, opacc_header) = ops_of_evaled_vert_box_list fs pbinfo pt_header opaccpage evvblst_header in let (evvblst_footer, _) = pagepartssch.footer_content |> PageInfo.embed_page_info_vert pbinfo in let pt_footer = invert_coordinate paper_height pagepartssch.footer_origin in - let (_, opacc_footer) = ops_of_evaled_vert_box_list fs_pdf pbinfo pt_footer opacc_header evvblst_footer in + let (_, opacc_footer) = ops_of_evaled_vert_box_list fs pbinfo pt_footer opacc_header evvblst_footer in let oplst = Alist.to_list opacc_footer in diff --git a/src/backend/handlePdf.mli b/src/backend/handlePdf.mli index f93c568a3..a4682c5fc 100644 --- a/src/backend/handlePdf.mli +++ b/src/backend/handlePdf.mli @@ -7,12 +7,20 @@ type t val create_empty_pdf : abs_path -> t +type config = { + debug_show_bbox : bool; + debug_show_space : bool; + debug_show_block_bbox : bool; + debug_show_block_space : bool; + debug_show_overfull : bool; +} + type page -val write_page : page -> page_parts_scheme_func -> t -> t +val write_page : config -> page -> page_parts_scheme_func -> t -> t val write_to_file : t -> unit val make_empty_page : paper_size:(length * length) -> page_break_info -> page_content_scheme -> page -val add_column_to_page : page -> length -> evaled_vert_box list -> evaled_vert_box list -> page +val add_column_to_page : config -> page -> length -> evaled_vert_box list -> evaled_vert_box list -> page diff --git a/src/backend/optionState.ml b/src/backend/optionState.ml deleted file mode 100644 index ea64b04d1..000000000 --- a/src/backend/optionState.ml +++ /dev/null @@ -1,97 +0,0 @@ - -open MyUtil - -type output_mode = - | PdfMode - | TextMode of string list - -type build_state = { - input_file : abs_path; - output_file : abs_path option; - output_mode : output_mode; - page_number_limit : int; - debug_show_bbox : bool; - debug_show_space : bool; - debug_show_block_bbox : bool; - debug_show_block_space : bool; - debug_show_overfull : bool; - type_check_only : bool; - bytecomp : bool; -} - -type test_state = { - input_file_to_test : abs_path; - output_mode_to_test : output_mode; -} - -type command_state = - | BuildState of build_state - | TestState of test_state - | SolveState - -type state = { - command_state : command_state; - extra_config_paths : (string list) option; - show_full_path : bool; - no_default_config : bool; -} - - -let state = ref None - - -let set r = - state := Some(r) - - -let get () = - match !state with - | None -> assert false - | Some(r) -> r - - -let get_build_state () = - match (get ()).command_state with - | BuildState(b) -> b - | _ -> assert false - - -let get_input_file () = - match (get ()).command_state with - | BuildState({ input_file; _ }) -> input_file - | TestState({ input_file_to_test; _}) -> input_file_to_test - | SolveState -> assert false - - -let get_output_mode () = - match (get ()).command_state with - | BuildState({ output_mode; _ }) -> output_mode - | TestState({ output_mode_to_test; _}) -> output_mode_to_test - | SolveState -> assert false - - -let get_page_number_limit () = (get_build_state ()).page_number_limit -let does_show_full_path () = (get ()).show_full_path -let does_debug_show_bbox () = (get_build_state ()).debug_show_bbox -let does_debug_show_space () = (get_build_state ()).debug_show_space -let does_debug_show_block_bbox () = (get_build_state ()).debug_show_block_bbox -let does_debug_show_block_space () = (get_build_state ()).debug_show_block_space -let does_debug_show_overfull () = (get_build_state ()).debug_show_overfull - - -let is_bytecomp_mode () = - match (get ()).command_state with - | BuildState({ bytecomp; _ }) -> bytecomp - | TestState(_) -> false - | SolveState -> assert false - - -let job_directory () = - let abspath = get_input_file () in - Filename.dirname (get_abs_path_string abspath) - - -let is_text_mode () = - match get_output_mode () with - | TextMode(_) -> true - | PdfMode -> false diff --git a/src/backend/optionState.mli b/src/backend/optionState.mli deleted file mode 100644 index 5d642f98f..000000000 --- a/src/backend/optionState.mli +++ /dev/null @@ -1,54 +0,0 @@ - -open MyUtil - -type output_mode = - | PdfMode - | TextMode of string list - -type build_state = { - input_file : abs_path; - output_file : abs_path option; - output_mode : output_mode; - page_number_limit : int; - debug_show_bbox : bool; - debug_show_space : bool; - debug_show_block_bbox : bool; - debug_show_block_space : bool; - debug_show_overfull : bool; - type_check_only : bool; - bytecomp : bool; -} - -type test_state = { - input_file_to_test : abs_path; - output_mode_to_test : output_mode; -} - -type command_state = - | BuildState of build_state - | TestState of test_state - | SolveState - -type state = { - command_state : command_state; - extra_config_paths : (string list) option; - show_full_path : bool; - no_default_config : bool; -} - -val set : state -> unit - -val get : unit -> state - -val get_page_number_limit : unit -> int -val does_show_full_path : unit -> bool -val does_debug_show_bbox : unit -> bool -val does_debug_show_space : unit -> bool -val does_debug_show_block_bbox : unit -> bool -val does_debug_show_block_space : unit -> bool -val does_debug_show_overfull : unit -> bool -val is_bytecomp_mode : unit -> bool - -val job_directory : unit -> string - -val is_text_mode : unit -> bool diff --git a/src/backend/pageBreak.ml b/src/backend/pageBreak.ml index 7ca666bfd..d5d4902f2 100644 --- a/src/backend/pageBreak.ml +++ b/src/backend/pageBreak.ml @@ -693,7 +693,7 @@ let chop_single_column_with_insertion (pbinfo : page_break_info) (content_height chop_single_column pbinfo content_height (List.append pbvblst_inserted pbvblst) -let main (absname_out : abs_path) ~(paper_size : length * length) (columnhookf : column_hook_func) (pagecontf : page_content_scheme_func) (pagepartsf : page_parts_scheme_func) (vblst : vert_box list) : HandlePdf.t = +let main (pdf_config : HandlePdf.config) (absname_out : abs_path) ~(paper_size : length * length) (columnhookf : column_hook_func) (pagecontf : page_content_scheme_func) (pagepartsf : page_parts_scheme_func) (vblst : vert_box list) : HandlePdf.t = let pdfinit = HandlePdf.create_empty_pdf absname_out in @@ -704,8 +704,8 @@ let main (absname_out : abs_path) ~(paper_size : length * length) (columnhookf : chop_single_column_with_insertion pbinfo pagecontsch.page_content_height columnhookf pbvblst in let page = HandlePdf.make_empty_page ~paper_size pbinfo pagecontsch in - let page = HandlePdf.add_column_to_page page Length.zero evvblstpage footnote in - let pdfaccnew = pdfacc |> HandlePdf.write_page page pagepartsf in + let page = HandlePdf.add_column_to_page pdf_config page Length.zero evvblstpage footnote in + let pdfaccnew = pdfacc |> HandlePdf.write_page pdf_config page pagepartsf in match restopt with | None -> pdfaccnew | Some(rest) -> aux (pageno + 1) pdfaccnew rest @@ -714,12 +714,10 @@ let main (absname_out : abs_path) ~(paper_size : length * length) (columnhookf : aux 1 pdfinit pbvblst -let main_multicolumn (absname_out : abs_path) ~(paper_size : length * length) (origin_shifts : length list) (columnhookf : column_hook_func) (columnendhookf : column_hook_func) (pagecontf : page_content_scheme_func) (pagepartsf : page_parts_scheme_func) (vblst : vert_box list) : HandlePdf.t = +let main_multicolumn (pdf_config : HandlePdf.config) ~(page_number_limit : int) (absname_out : abs_path) ~(paper_size : length * length) (origin_shifts : length list) (columnhookf : column_hook_func) (columnendhookf : column_hook_func) (pagecontf : page_content_scheme_func) (pagepartsf : page_parts_scheme_func) (vblst : vert_box list) : HandlePdf.t = let pdfinit = HandlePdf.create_empty_pdf absname_out in - let page_number_limit = OptionState.get_page_number_limit () in - let rec iter_on_column (pbinfo : page_break_info) (content_height : length) (page : HandlePdf.page) (pbvbs : pb_vert_box list) (origin_shifts : length list) = @@ -736,7 +734,7 @@ let main_multicolumn (absname_out : abs_path) ~(paper_size : length * length) (o in (* Adds the column to the page and invokes hook functions. *) - let page = HandlePdf.add_column_to_page page origin_shift body footnote in + let page = HandlePdf.add_column_to_page pdf_config page origin_shift body footnote in begin match restopt with | None -> @@ -763,7 +761,7 @@ let main_multicolumn (absname_out : abs_path) ~(paper_size : length * length) (o (* Creates an empty page and iteratively adds columns to it. *) let page = HandlePdf.make_empty_page ~paper_size pbinfo pagecontsch in let (page, rest) = iter_on_column pbinfo content_height page pbvbs origin_shifts in - let pdfacc = pdfacc |> HandlePdf.write_page page pagepartsf in + let pdfacc = pdfacc |> HandlePdf.write_page pdf_config page pagepartsf in match rest with | [] -> pdfacc | _ :: _ -> iter_on_page (pageno + 1) pdfacc rest diff --git a/src/backend/pageBreak.mli b/src/backend/pageBreak.mli index 5bac7b2d1..0485d254b 100644 --- a/src/backend/pageBreak.mli +++ b/src/backend/pageBreak.mli @@ -7,9 +7,9 @@ exception PageNumberLimitExceeded of int val solidify : vert_box list -> intermediate_vert_box list -val main : abs_path -> paper_size:(length * length) -> column_hook_func -> page_content_scheme_func -> page_parts_scheme_func -> vert_box list -> HandlePdf.t +val main : HandlePdf.config -> abs_path -> paper_size:(length * length) -> column_hook_func -> page_content_scheme_func -> page_parts_scheme_func -> vert_box list -> HandlePdf.t -val main_multicolumn : abs_path -> paper_size:(length * length) -> length list -> column_hook_func -> column_hook_func -> page_content_scheme_func -> page_parts_scheme_func -> vert_box list -> HandlePdf.t +val main_multicolumn : HandlePdf.config -> page_number_limit:int -> abs_path -> paper_size:(length * length) -> length list -> column_hook_func -> column_hook_func -> page_content_scheme_func -> page_parts_scheme_func -> vert_box list -> HandlePdf.t val adjust_to_first_line : intermediate_vert_box list -> length * length diff --git a/src/frontend/bytecomp/bytecomp.ml b/src/frontend/bytecomp/bytecomp.ml index e98b8f925..b74602b3a 100644 --- a/src/frontend/bytecomp/bytecomp.ml +++ b/src/frontend/bytecomp/bytecomp.ml @@ -15,8 +15,7 @@ let compile_and_exec_0 (env : environment) (ast : abstract_tree) : syntactic_val let compile_environment (env : environment) : unit = - let (binds, _) = env in - binds |> EvalVarIDMap.iter (fun _evid loc -> + env.env_main |> EvalVarIDMap.iter (fun _evid loc -> match !loc with | PrimitiveClosure(parbr, _env1, arity, astf) -> begin diff --git a/src/frontend/bytecomp/ir.cppo.ml b/src/frontend/bytecomp/ir.cppo.ml index e4a5b0338..8237f7b27 100644 --- a/src/frontend/bytecomp/ir.cppo.ml +++ b/src/frontend/bytecomp/ir.cppo.ml @@ -127,7 +127,7 @@ and transform_1_math_text_content (_env : frame) (_ims : math_text_element list) and transform_ast_0 (env : environment) (ast : abstract_tree) : ir * environment = - let (genv, _) = env in + let genv = env.env_main in let initvars = EvalVarIDMap.fold (fun k v acc -> EvalVarIDMap.add k (GlobalVar(v, k, ref 0)) acc @@ -139,7 +139,7 @@ and transform_ast_0 (env : environment) (ast : abstract_tree) : ir * environment and transform_ast_1 (env : environment) (ast : abstract_tree) : ir * environment = - let (genv, _) = env in + let genv = env.env_main in let initvars = EvalVarIDMap.fold (fun k v acc -> EvalVarIDMap.add k (GlobalVar(v, k, ref 0)) acc diff --git a/src/frontend/bytecomp/vm.cppo.ml b/src/frontend/bytecomp/vm.cppo.ml index 462830e88..a85b04dbc 100644 --- a/src/frontend/bytecomp/vm.cppo.ml +++ b/src/frontend/bytecomp/vm.cppo.ml @@ -74,6 +74,11 @@ let lex_horz_text (ctx : HorzBox.context_main) (s_utf8 : string) : HorzBox.horz_ HorzBox.([ HorzPure(PHCInnerString{ context = ctx; chars = uchlst }) ]) +let get_runtime_config (env : vmenv) : runtime_config = + let (global, _) = env in + global.env_config + + let popn (stack : stack) (n : int) : syntactic_value list * stack = let rec iter st n acc = if n = 0 then diff --git a/src/frontend/closedLockDependencyResolver.ml b/src/frontend/closedLockDependencyResolver.ml index 85ffbed57..b71810893 100644 --- a/src/frontend/closedLockDependencyResolver.ml +++ b/src/frontend/closedLockDependencyResolver.ml @@ -11,7 +11,7 @@ type 'a ok = ('a, config_error) result module LockDependencyGraph = DependencyGraph.Make(String) -let main ~(use_test_only_lock : bool) ~library_root:(absdir_lib_root : abs_path) ~(extensions : string list) (lock_config : LockConfig.t) : ((lock_name * (PackageConfig.t * untyped_package)) list) ok = +let main (display_config : Logging.config) ~(use_test_only_lock : bool) ~library_root:(absdir_lib_root : abs_path) ~(extensions : string list) (lock_config : LockConfig.t) : ((lock_name * (PackageConfig.t * untyped_package)) list) ok = let open ResultMonad in let locks = lock_config.LockConfig.locked_packages in @@ -31,7 +31,7 @@ let main ~(use_test_only_lock : bool) ~library_root:(absdir_lib_root : abs_path) make_abs_path (Filename.concat (get_abs_path_string absdir_lib_root) (get_lib_path_string libdir)) in let* package_with_config = - PackageReader.main ~use_test_files:use_test_only_lock ~extensions absdir_package + PackageReader.main display_config ~use_test_files:use_test_only_lock ~extensions absdir_package in let* (graph, vertex) = graph |> LockDependencyGraph.add_vertex lock_name package_with_config diff --git a/src/frontend/evaluator.cppo.ml b/src/frontend/evaluator.cppo.ml index 232b7c088..ce7d77a98 100644 --- a/src/frontend/evaluator.cppo.ml +++ b/src/frontend/evaluator.cppo.ml @@ -42,6 +42,10 @@ let find_symbol (env : environment) (evid : EvalVarID.t) : CodeSymbol.t option = None +let get_runtime_config (env : environment) : runtime_config = + env.env_config + + let generate_symbol_for_eval_var_id (evid : EvalVarID.t) (env : environment) : environment * CodeSymbol.t = let symb = let varnm = EvalVarID.get_varnm evid in diff --git a/src/frontend/lockConfig.ml b/src/frontend/lockConfig.ml index 034643561..c3630da39 100644 --- a/src/frontend/lockConfig.ml +++ b/src/frontend/lockConfig.ml @@ -96,12 +96,12 @@ let load (abspath_lock_config : abs_path) : t ok = |> Result.map_error (fun e -> LockConfigError(abspath_lock_config, e)) -let write (abspath_lock_config : abs_path) (lock_config : t) : unit = +let write (display_config : Logging.config) (abspath_lock_config : abs_path) (lock_config : t) : unit = let yaml = lock_config_encoder lock_config in match Yaml.to_string ~encoding:`Utf8 ~layout_style:`Block ~scalar_style:`Plain yaml with | Ok(data) -> Core.Out_channel.write_all (get_abs_path_string abspath_lock_config) ~data; - Logging.end_lock_output abspath_lock_config + Logging.end_lock_output display_config abspath_lock_config | Error(_) -> assert false diff --git a/src/frontend/logging.ml b/src/frontend/logging.ml index f495dc4e8..cf38d1000 100644 --- a/src/frontend/logging.ml +++ b/src/frontend/logging.ml @@ -3,26 +3,31 @@ open MyUtil open PackageSystemBase -let show_path abspath = +type config = { + show_full_path : bool; +} + + +let show_path (config : config) (abspath : abs_path) = let pathstr = get_abs_path_string abspath in - if OptionState.does_show_full_path () then pathstr else Filename.basename pathstr + if config.show_full_path then pathstr else Filename.basename pathstr -let begin_to_typecheck_file abspath_in = +let begin_to_typecheck_file (config : config) (abspath_in : abs_path) = print_endline (" ---- ---- ---- ----"); - print_endline (" type checking '" ^ (show_path abspath_in) ^ "' ...") + print_endline (" type checking '" ^ (show_path config abspath_in) ^ "' ...") -let begin_to_preprocess_file abspath_in = - print_endline (" preprocessing '" ^ (show_path abspath_in) ^ "' ...") +let begin_to_preprocess_file (config : config) (abspath_in : abs_path) = + print_endline (" preprocessing '" ^ (show_path config abspath_in) ^ "' ...") -let begin_to_eval_file abspath_in = - print_endline (" evaluating '" ^ (show_path abspath_in) ^ "' ...") +let begin_to_eval_file (config : config) (abspath_in : abs_path) = + print_endline (" evaluating '" ^ (show_path config abspath_in) ^ "' ...") -let begin_to_parse_file abspath_in = - print_endline (" parsing '" ^ (show_path abspath_in) ^ "' ...") +let begin_to_parse_file (config : config) (abspath_in : abs_path) = + print_endline (" parsing '" ^ (show_path config abspath_in) ^ "' ...") let pass_type_check opt = @@ -79,25 +84,25 @@ let achieve_fixpoint unresolved_crossrefs = print_endline (" some cross references were not solved: " ^ String.concat " " unresolved_crossrefs ^ ".") -let end_output file_name_out = +let end_output (config : config) (file_name_out : abs_path) = print_endline (" ---- ---- ---- ----"); - print_endline (" output written on '" ^ (show_path file_name_out) ^ "'.") + print_endline (" output written on '" ^ (show_path config file_name_out) ^ "'.") -let target_file file_name_out = +let target_file (config : config) (file_name_out : abs_path) = print_endline (" ---- ---- ---- ----"); - print_endline (" target file: '" ^ (show_path file_name_out) ^ "'") + print_endline (" target file: '" ^ (show_path config file_name_out) ^ "'") -let dump_file ~(already_exists : bool) dump_file = +let dump_file (config : config) ~(already_exists : bool) (dump_file : abs_path) = if already_exists then - print_endline (" dump file: '" ^ (show_path dump_file) ^ "' (already exists)") + print_endline (" dump file: '" ^ (show_path config dump_file) ^ "' (already exists)") else - print_endline (" dump file: '" ^ (show_path dump_file) ^ "' (will be created)") + print_endline (" dump file: '" ^ (show_path config dump_file) ^ "' (will be created)") -let lock_config_file (abspath_lock_config : abs_path) = - Printf.printf " lock file: '%s'\n" (show_path abspath_lock_config) +let lock_config_file (config : config) (abspath_lock_config : abs_path) = + Printf.printf " lock file: '%s'\n" (show_path config abspath_lock_config) let begin_to_embed_fonts () = @@ -134,13 +139,14 @@ let show_package_dependency_solutions (solutions : package_solution list) = ) -let end_lock_output file_name_out = +let end_lock_output (config : config) (file_name_out : abs_path) = print_endline (" ---- ---- ---- ----"); - print_endline (" output written on '" ^ (show_path file_name_out) ^ "'.") + print_endline (" output written on '" ^ (show_path config file_name_out) ^ "'.") -let warn_cmyk_image file_name = - print_endline (" [Warning] (" ^ (show_path file_name) ^ ") Jpeg images with CMYK color mode are not fully supported."); +let warn_cmyk_image (file_name : abs_path) = + let config = { show_full_path = true } in (* TODO: make this changeable *) + print_endline (" [Warning] (" ^ (show_path config file_name) ^ ") Jpeg images with CMYK color mode are not fully supported."); print_endline (" Please convert the image to a jpeg image with YCbCr (RGB) color model.") diff --git a/src/frontend/logging.mli b/src/frontend/logging.mli index 00e18d32a..afc11d139 100644 --- a/src/frontend/logging.mli +++ b/src/frontend/logging.mli @@ -2,13 +2,19 @@ open MyUtil open PackageSystemBase -val begin_to_typecheck_file : abs_path -> unit +type config = { + show_full_path : bool; +} -val begin_to_preprocess_file : abs_path -> unit +val show_path : config -> abs_path -> string -val begin_to_eval_file : abs_path -> unit +val begin_to_typecheck_file : config -> abs_path -> unit -val begin_to_parse_file : abs_path -> unit +val begin_to_preprocess_file : config -> abs_path -> unit + +val begin_to_eval_file : config -> abs_path -> unit + +val begin_to_parse_file : config -> abs_path -> unit val pass_type_check : string option -> unit @@ -22,13 +28,13 @@ val achieve_count_max : unit -> unit val achieve_fixpoint : string list -> unit -val end_output : abs_path -> unit +val end_output : config -> abs_path -> unit -val target_file : abs_path -> unit +val target_file : config -> abs_path -> unit -val dump_file : already_exists:bool -> abs_path -> unit +val dump_file : config -> already_exists:bool -> abs_path -> unit -val lock_config_file : abs_path -> unit +val lock_config_file : config -> abs_path -> unit val show_package_dependency_before_solving : (dependency_flag * package_dependency) list -> unit @@ -40,7 +46,7 @@ val begin_to_write_page : unit -> unit val needs_another_trial : unit -> unit -val end_lock_output : abs_path -> unit +val end_lock_output : config -> abs_path -> unit val warn_noninjective_cmap : Uchar.t -> Uchar.t -> Otfed.Value.glyph_id -> unit diff --git a/src/frontend/main.ml b/src/frontend/main.ml index 73ddfba7c..6fc4e06f7 100644 --- a/src/frontend/main.ml +++ b/src/frontend/main.ml @@ -20,29 +20,30 @@ let version = (* Initialization that should be performed before every cross-reference-solving loop *) -let reset () = +let reset (output_mode : output_mode) = let open ResultMonad in - if OptionState.is_text_mode () then - return () - else begin - ImageInfo.initialize (); - NamedDest.initialize (); - return () - end + match output_mode with + | TextMode(_) -> + return () + | PdfMode -> + ImageInfo.initialize (); + NamedDest.initialize (); + return () (* Initialization that should be performed before typechecking *) -let initialize () : Typeenv.t * environment = +let initialize ~(is_bytecomp_mode : bool) (output_mode : output_mode) (runtime_config : runtime_config) : Typeenv.t * environment = FreeID.initialize (); BoundID.initialize (); EvalVarID.initialize (); StoreID.initialize (); FontInfo.initialize (); let res = - if OptionState.is_text_mode () then - Primitives.make_text_mode_environments () - else - Primitives.make_pdf_mode_environments () + match output_mode with + | TextMode(_) -> + Primitives.make_text_mode_environments runtime_config + | PdfMode -> + Primitives.make_pdf_mode_environments runtime_config in let (tyenv, env) = match res with @@ -50,7 +51,7 @@ let initialize () : Typeenv.t * environment = | Error(e) -> raise (ConfigError(e)) in begin - if OptionState.is_bytecomp_mode () then + if is_bytecomp_mode then Bytecomp.compile_environment env else () @@ -61,24 +62,52 @@ let initialize () : Typeenv.t * environment = module StoreIDMap = Map.Make(StoreID) -type frozen_environment = location EvalVarIDMap.t * (syntactic_value StoreIDHashTable.t) ref * syntactic_value StoreIDMap.t +type frozen_environment = { + frozen_main : location EvalVarIDMap.t; + frozen_store_ref : (syntactic_value StoreIDHashTable.t) ref; + frozen_store_map : syntactic_value StoreIDMap.t; + frozen_config : runtime_config; +} let freeze_environment (env : environment) : frozen_environment = - let (valenv, stenvref) = env in + let + { + env_main = valenv; + env_store = stenvref; + env_config = runtime_config; + } = env + in let stmap = StoreIDMap.empty |> StoreIDHashTable.fold (fun stid value stmap -> stmap |> StoreIDMap.add stid value ) (!stenvref) in - (valenv, stenvref, stmap) - - -let unfreeze_environment ((valenv, stenvref, stmap) : frozen_environment) : environment = + { + frozen_main = valenv; + frozen_store_ref = stenvref; + frozen_store_map = stmap; + frozen_config = runtime_config; + } + + +let unfreeze_environment (frenv : frozen_environment) : environment = + let + { + frozen_main = valenv; + frozen_store_ref = stenvref; + frozen_store_map = stmap; + frozen_config = runtime_config; + } = frenv + in let stenv = StoreIDHashTable.create 128 in stmap |> StoreIDMap.iter (fun stid value -> StoreIDHashTable.add stenv stid value); stenvref := stenv; - (valenv, ref stenv) + { + env_main = valenv; + env_store = ref stenv; + env_config = runtime_config; + } let output_pdf (pdfret : HandlePdf.t) : unit = @@ -89,9 +118,9 @@ let output_text (abspath_out : abs_path) (data : string) : unit = Core.Out_channel.write_all (get_abs_path_string abspath_out) ~data -let eval_library_file ~(run_tests : bool) (env : environment) (abspath : abs_path) (binds : binding list) : environment = - Logging.begin_to_eval_file abspath; - if OptionState.is_bytecomp_mode () then +let eval_library_file (display_config : Logging.config) ~(is_bytecomp_mode : bool) ~(run_tests : bool) (env : environment) (abspath : abs_path) (binds : binding list) : environment = + Logging.begin_to_eval_file display_config abspath; + if is_bytecomp_mode then failwith "TODO: eval_libary_file, Bytecomp" (* let (value, _) = Bytecomp.compile_and_exec_0 env ast in @@ -102,9 +131,9 @@ let eval_library_file ~(run_tests : bool) (env : environment) (abspath : abs_pat env -let eval_main (i : int) (env_freezed : frozen_environment) (ast : abstract_tree) : syntactic_value = +let eval_main ~(is_bytecomp_mode : bool) (output_mode : output_mode) (i : int) (env_freezed : frozen_environment) (ast : abstract_tree) : syntactic_value = Logging.start_evaluation i; - let res = reset () in + let res = reset output_mode in begin match res with | Ok(()) -> () @@ -112,7 +141,7 @@ let eval_main (i : int) (env_freezed : frozen_environment) (ast : abstract_tree) end; let env = unfreeze_environment env_freezed in let value = - if OptionState.is_bytecomp_mode () then + if is_bytecomp_mode then let (value, _) = Bytecomp.compile_and_exec_0 env ast in value else @@ -122,74 +151,75 @@ let eval_main (i : int) (env_freezed : frozen_environment) (ast : abstract_tree) value -let eval_document_file (env : environment) (ast : abstract_tree) (abspath_out : abs_path) (abspath_dump : abs_path) = +let eval_document_file (display_config : Logging.config) (pdf_config : HandlePdf.config) ~(page_number_limit : int) ~(is_bytecomp_mode : bool) (output_mode : output_mode) (env : environment) (ast : abstract_tree) (abspath_out : abs_path) (abspath_dump : abs_path) = let env_freezed = freeze_environment env in - if OptionState.is_text_mode () then - let rec aux (i : int) = - let value_str = eval_main i env_freezed ast in - let s = EvalUtil.get_string value_str in - match CrossRef.needs_another_trial abspath_dump with - | CrossRef.NeedsAnotherTrial -> - Logging.needs_another_trial (); - aux (i + 1); - - | CrossRef.CountMax -> - Logging.achieve_count_max (); - output_text abspath_out s; - Logging.end_output abspath_out; - - | CrossRef.CanTerminate unresolved_crossrefs -> - Logging.achieve_fixpoint unresolved_crossrefs; - output_text abspath_out s; - Logging.end_output abspath_out; - in - aux 1 - else - let rec aux (i : int) = - let value_doc = eval_main i env_freezed ast in - match value_doc with - | BaseConstant(BCDocument(paper_size, pbstyle, columnhookf, columnendhookf, pagecontf, pagepartsf, imvblst)) -> - Logging.start_page_break (); - State.start_page_break (); - let pdf = - match pbstyle with - | SingleColumn -> - PageBreak.main abspath_out ~paper_size - columnhookf pagecontf pagepartsf imvblst - - | MultiColumn(origin_shifts) -> - PageBreak.main_multicolumn abspath_out ~paper_size - origin_shifts columnhookf columnendhookf pagecontf pagepartsf imvblst - in - begin - match CrossRef.needs_another_trial abspath_dump with - | CrossRef.NeedsAnotherTrial -> - Logging.needs_another_trial (); - aux (i + 1); - - | CrossRef.CountMax -> - Logging.achieve_count_max (); - output_pdf pdf; - Logging.end_output abspath_out; - - | CrossRef.CanTerminate unresolved_crossrefs -> - Logging.achieve_fixpoint unresolved_crossrefs; - output_pdf pdf; - Logging.end_output abspath_out; - end - - | _ -> - EvalUtil.report_bug_value "main; not a DocumentValue(...)" value_doc - in - aux 1 + match output_mode with + | TextMode(_) -> + let rec aux (i : int) = + let value_str = eval_main ~is_bytecomp_mode output_mode i env_freezed ast in + let s = EvalUtil.get_string value_str in + match CrossRef.needs_another_trial abspath_dump with + | CrossRef.NeedsAnotherTrial -> + Logging.needs_another_trial (); + aux (i + 1); + + | CrossRef.CountMax -> + Logging.achieve_count_max (); + output_text abspath_out s; + Logging.end_output display_config abspath_out; + + | CrossRef.CanTerminate unresolved_crossrefs -> + Logging.achieve_fixpoint unresolved_crossrefs; + output_text abspath_out s; + Logging.end_output display_config abspath_out; + in + aux 1 + | PdfMode -> + let rec aux (i : int) = + let value_doc = eval_main ~is_bytecomp_mode output_mode i env_freezed ast in + match value_doc with + | BaseConstant(BCDocument(paper_size, pbstyle, columnhookf, columnendhookf, pagecontf, pagepartsf, imvblst)) -> + Logging.start_page_break (); + State.start_page_break (); + let pdf = + match pbstyle with + | SingleColumn -> + PageBreak.main pdf_config abspath_out ~paper_size + columnhookf pagecontf pagepartsf imvblst + + | MultiColumn(origin_shifts) -> + PageBreak.main_multicolumn pdf_config ~page_number_limit abspath_out ~paper_size + origin_shifts columnhookf columnendhookf pagecontf pagepartsf imvblst + in + begin + match CrossRef.needs_another_trial abspath_dump with + | CrossRef.NeedsAnotherTrial -> + Logging.needs_another_trial (); + aux (i + 1); + + | CrossRef.CountMax -> + Logging.achieve_count_max (); + output_pdf pdf; + Logging.end_output display_config abspath_out; + + | CrossRef.CanTerminate unresolved_crossrefs -> + Logging.achieve_fixpoint unresolved_crossrefs; + output_pdf pdf; + Logging.end_output display_config abspath_out; + end + + | _ -> + EvalUtil.report_bug_value "main; not a DocumentValue(...)" value_doc + in + aux 1 (* Performs preprecessing. the evaluation is run by the naive interpreter regardless of whether `--bytecomp` was specified. *) -let preprocess_bindings ~(run_tests : bool) (env : environment) (libs : (abs_path * binding list) list) : environment * (abs_path * code_rec_or_nonrec list) list = +let preprocess_bindings (display_config : Logging.config) ~(run_tests : bool) (env : environment) (libs : (abs_path * binding list) list) : environment * (abs_path * code_rec_or_nonrec list) list = let (env, codebindacc) = libs |> List.fold_left (fun (env, codebindacc) (abspath, binds) -> - Logging.begin_to_preprocess_file abspath; + Logging.begin_to_preprocess_file display_config abspath; let (env, cd_rec_or_nonrecs) = Evaluator.interpret_bindings_0 ~run_tests env binds in (env, Alist.extend codebindacc (abspath, cd_rec_or_nonrecs)) ) (env, Alist.empty) @@ -199,34 +229,26 @@ let preprocess_bindings ~(run_tests : bool) (env : environment) (libs : (abs_pat (* Performs evaluation and returns the resulting environment. *) -let evaluate_bindings ~(run_tests : bool) (env : environment) (codebinds : (abs_path * code_rec_or_nonrec list) list) : environment = +let evaluate_bindings (display_config : Logging.config) ~(is_bytecomp_mode : bool) ~(run_tests : bool) (env : environment) (codebinds : (abs_path * code_rec_or_nonrec list) list) : environment = codebinds |> List.fold_left (fun env (abspath, cd_rec_or_nonrecs) -> let binds = cd_rec_or_nonrecs |> List.map (fun cd_rec_or_nonrec -> Bind(Stage0, unlift_rec_or_nonrec cd_rec_or_nonrec) ) in - eval_library_file ~run_tests env abspath binds + eval_library_file display_config ~is_bytecomp_mode ~run_tests env abspath binds ) env -let preprocess_and_evaluate ~(run_tests : bool) (env : environment) (libs : (abs_path * binding list) list) (ast_doc : abstract_tree) (_abspath_in : abs_path) (abspath_out : abs_path) (abspath_dump : abs_path) = +let preprocess_and_evaluate (display_config : Logging.config) (pdf_config : HandlePdf.config) ~(page_number_limit : int) ~(is_bytecomp_mode : bool) (output_mode : output_mode) ~(run_tests : bool) (env : environment) (libs : (abs_path * binding list) list) (ast_doc : abstract_tree) (_abspath_in : abs_path) (abspath_out : abs_path) (abspath_dump : abs_path) = (* Performs preprocessing: *) - let (env, codebinds) = preprocess_bindings ~run_tests env libs in + let (env, codebinds) = preprocess_bindings display_config ~run_tests env libs in let code_doc = Evaluator.interpret_1 env ast_doc in (* Performs evaluation: *) - let env = evaluate_bindings ~run_tests env codebinds in + let env = evaluate_bindings display_config ~is_bytecomp_mode ~run_tests env codebinds in let ast_doc = unlift_code code_doc in - eval_document_file env ast_doc abspath_out abspath_dump - - -let convert_abs_path_to_show (abspath : abs_path) : string = - let abspathstr = get_abs_path_string abspath in - if OptionState.does_show_full_path () then - abspathstr - else - Filename.basename abspathstr + eval_document_file display_config pdf_config ~page_number_limit ~is_bytecomp_mode output_mode env ast_doc abspath_out abspath_dump type line = @@ -936,16 +958,16 @@ let report_document_attribute_error : DocumentAttribute.error -> unit = function ] -let report_config_error : config_error -> unit = function +let report_config_error (display_config : Logging.config) : config_error -> unit = function | NotADocumentFile(abspath_in, ty) -> - let fname = convert_abs_path_to_show abspath_in in + let fname = Logging.show_path display_config abspath_in in report_error Typechecker [ NormalLine(Printf.sprintf "file '%s' is not a document file; it is of type" fname); DisplayLine(Display.show_mono_type ty); ] | NotAStringFile(abspath_in, ty) -> - let fname = convert_abs_path_to_show abspath_in in + let fname = Logging.show_path display_config abspath_in in report_error Typechecker [ NormalLine(Printf.sprintf "file '%s' is not a file for generating text; it is of type" fname); DisplayLine(Display.show_mono_type ty); @@ -1285,36 +1307,36 @@ let report_config_error : config_error -> unit = function end -let report_font_error : font_error -> unit = function +let report_font_error (display_config : Logging.config) : font_error -> unit = function | FailedToReadFont(abspath, msg) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "cannot load font file '%s';" fname); DisplayLine(msg); ] | FailedToDecodeFont(abspath, e) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "cannot decode font file '%s';" fname); NormalLine(Format.asprintf "%a" Otfed.Decode.Error.pp e); ] | FailedToMakeSubset(abspath, e) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "cannot make a subset of font file '%s';" fname); NormalLine(Format.asprintf "%a" Otfed.Subset.Error.pp e); ] | NotASingleFont(abspath) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "the font file '%s' is not a single font file." fname); ] | NotAFontCollectionElement(abspath, index) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "the font file '%s' (used with index %d) is not a collection." fname index); ] @@ -1329,32 +1351,32 @@ let report_font_error : font_error -> unit = function (NormalLine(Printf.sprintf "cannot find '%s'. candidates:" (get_lib_path_string libpath)) :: lines) | NoMathTable(abspath) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "font file '%s' does not have a 'MATH' table." fname); ] | PostscriptNameNotFound(abspath) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "font file '%s' does not have a PostScript name." fname); ] | CannotFindUnicodeCmap(abspath) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "font file '%s' does not have a 'cmap' subtable for Unicode code points." fname); ] | CollectionIndexOutOfBounds{ path; index; num_elements } -> - let fname = convert_abs_path_to_show path in + let fname = Logging.show_path display_config path in report_error Interface [ NormalLine(Printf.sprintf "%d: index out of bounds;" index); NormalLine(Printf.sprintf "font file '%s' has %d elements." fname num_elements); ] -let error_log_environment (suspended : unit -> unit) : unit = +let error_log_environment (display_config : Logging.config) (suspended : unit -> unit) : unit = try suspended () with @@ -1400,34 +1422,34 @@ let error_log_environment (suspended : unit -> unit) : unit = ] | ConfigError(e) -> - report_config_error e + report_config_error display_config e | FontInfo.FontInfoError(e) -> - report_font_error e + report_font_error display_config e | ImageHashTable.CannotLoadPdf(msg, abspath, pageno) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "cannot load PDF file '%s' page #%d;" fname pageno); DisplayLine(msg); ] | ImageHashTable.CannotLoadImage(msg, abspath) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "cannot load image file '%s';" fname); DisplayLine(msg); ] | ImageHashTable.ImageOfWrongFileType(abspath) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "cannot load image file '%s';" fname); DisplayLine("This file format is not supported."); ] | ImageHashTable.UnsupportedColorModel(_, abspath) -> - let fname = convert_abs_path_to_show abspath in + let fname = Logging.show_path display_config abspath in report_error Interface [ NormalLine(Printf.sprintf "cannot load image file '%s';" fname); DisplayLine("This color model is not supported."); @@ -1533,7 +1555,7 @@ let make_absolute_if_relative ~(origin : string) (s : string) : abs_path = make_abs_path abspath_str -let get_candidate_file_extensions (output_mode : OptionState.output_mode) = +let get_candidate_file_extensions (output_mode : output_mode) = match output_mode with | PdfMode -> [ ".satyh"; ".satyg" ] | TextMode(formats) -> List.append (formats |> List.map (fun s -> ".satyh-" ^ s)) [ ".satyg" ] @@ -1558,10 +1580,10 @@ let get_input_kind_from_extension (abspathstr_in : string) = | ext -> Error(ext) -let check_depended_packages ~(use_test_only_lock : bool) ~(library_root : abs_path) ~(extensions : string list) (tyenv_prim : Typeenv.t) (lock_config : LockConfig.t) = +let check_depended_packages (display_config : Logging.config) (typecheck_config : typecheck_config) ~(use_test_only_lock : bool) ~(library_root : abs_path) ~(extensions : string list) (tyenv_prim : Typeenv.t) (lock_config : LockConfig.t) = (* Resolve dependency among locked packages: *) let sorted_packages = - match ClosedLockDependencyResolver.main ~use_test_only_lock ~library_root ~extensions lock_config with + match ClosedLockDependencyResolver.main display_config ~use_test_only_lock ~library_root ~extensions lock_config with | Ok(sorted_packages) -> sorted_packages | Error(e) -> raise (ConfigError(e)) in @@ -1575,7 +1597,7 @@ let check_depended_packages ~(use_test_only_lock : bool) ~(library_root : abs_pa | UTFontPackage{ main_module_name; _ } -> main_module_name in let (ssig, libs) = - match PackageChecker.main tyenv_prim genv package with + match PackageChecker.main display_config typecheck_config tyenv_prim genv package with | Ok(pair) -> pair | Error(e) -> raise (ConfigError(e)) in @@ -1598,8 +1620,8 @@ let make_document_lock_config_path (basename_without_extension : string) = let make_output_mode text_mode_formats_str_opt = match text_mode_formats_str_opt with - | None -> OptionState.PdfMode - | Some(s) -> OptionState.TextMode(String.split_on_char ',' s) + | None -> PdfMode + | Some(s) -> TextMode(String.split_on_char ',' s) let load_lock_config (abspath_lock_config : abs_path) : LockConfig.t = @@ -1608,12 +1630,16 @@ let load_lock_config (abspath_lock_config : abs_path) : LockConfig.t = | Error(e) -> raise (ConfigError(e)) -let load_package ~(use_test_files : bool) ~(extensions : string list) (abspath_in : abs_path) = - match PackageReader.main ~use_test_files ~extensions abspath_in with +let load_package (display_config : Logging.config) ~(use_test_files : bool) ~(extensions : string list) (abspath_in : abs_path) = + match PackageReader.main display_config ~use_test_files ~extensions abspath_in with | Ok(pair) -> pair | Error(e) -> raise (ConfigError(e)) +let get_job_directory (abspath : abs_path) : string = + Filename.dirname (get_abs_path_string abspath) + + let build ~(fpath_in : string) ~(fpath_out_opt : string option) @@ -1630,35 +1656,37 @@ let build ~(bytecomp : bool) ~(no_default_config : bool) = - error_log_environment (fun () -> + let display_config = Logging.{ show_full_path } in + error_log_environment display_config (fun () -> let curdir = Sys.getcwd () in let input_file = make_absolute_if_relative ~origin:curdir fpath_in in + let job_directory = get_job_directory input_file in let output_file = fpath_out_opt |> Option.map (make_absolute_if_relative ~origin:curdir) in let extra_config_paths = config_paths_str_opt |> Option.map (String.split_on_char ':') in let output_mode = make_output_mode text_mode_formats_str_opt in - OptionState.set OptionState.{ - command_state = - BuildState{ - input_file; - output_file; - output_mode; - page_number_limit; - debug_show_bbox; - debug_show_space; - debug_show_block_bbox; - debug_show_block_space; - debug_show_overfull; - type_check_only; - bytecomp; - }; - extra_config_paths; - show_full_path; - no_default_config; - }; + let typecheck_config = + { + is_text_mode = + match output_mode with + | PdfMode -> false + | TextMode(_) -> true + } + in + let pdf_config = + HandlePdf.{ + debug_show_bbox; + debug_show_space; + debug_show_block_bbox; + debug_show_block_space; + debug_show_overfull; + } + in + let runtime_config = { job_directory } in let library_root = setup_root_dirs ~no_default_config ~extra_config_paths curdir in let abspath_in = input_file in + let is_bytecomp_mode = bytecomp in let build_input = let abspathstr_in = get_abs_path_string abspath_in in if Sys.is_directory abspathstr_in then @@ -1693,23 +1721,23 @@ let build in let extensions = get_candidate_file_extensions output_mode in - let (tyenv_prim, env) = initialize () in + let (tyenv_prim, env) = initialize ~is_bytecomp_mode output_mode runtime_config in match build_input with | PackageBuildInput{ lock = abspath_lock_config; } -> - Logging.lock_config_file abspath_lock_config; + Logging.lock_config_file display_config abspath_lock_config; let lock_config = load_lock_config abspath_lock_config in - let (_config, package) = load_package ~use_test_files:false ~extensions abspath_in in + let (_config, package) = load_package display_config ~use_test_files:false ~extensions abspath_in in let (genv, _configenv, _libs_dep) = - check_depended_packages ~use_test_only_lock:false ~library_root ~extensions tyenv_prim lock_config + check_depended_packages display_config typecheck_config ~use_test_only_lock:false ~library_root ~extensions tyenv_prim lock_config in begin - match PackageChecker.main tyenv_prim genv package with + match PackageChecker.main display_config typecheck_config tyenv_prim genv package with | Ok((_ssig, _libs)) -> () | Error(e) -> raise (ConfigError(e)) end @@ -1720,28 +1748,28 @@ let build out = abspath_out; dump = abspath_dump; } -> - Logging.lock_config_file abspath_lock_config; + Logging.lock_config_file display_config abspath_lock_config; let lock_config = load_lock_config abspath_lock_config in - Logging.target_file abspath_out; + Logging.target_file display_config abspath_out; let dump_file_exists = CrossRef.initialize abspath_dump in - Logging.dump_file ~already_exists:dump_file_exists abspath_dump; + Logging.dump_file display_config ~already_exists:dump_file_exists abspath_dump; let (genv, configenv, libs) = - check_depended_packages ~use_test_only_lock:false ~library_root ~extensions tyenv_prim lock_config + check_depended_packages display_config typecheck_config ~use_test_only_lock:false ~library_root ~extensions tyenv_prim lock_config in (* Resolve dependency of the document and the local source files: *) let (sorted_locals, utdoc) = - match OpenFileDependencyResolver.main ~extensions input_kind configenv abspath_in with + match OpenFileDependencyResolver.main display_config ~extensions input_kind configenv abspath_in with | Ok(pair) -> pair | Error(e) -> raise (ConfigError(e)) in (* Typechecking and elaboration: *) let (libs_local, ast_doc) = - match PackageChecker.main_document tyenv_prim genv sorted_locals (abspath_in, utdoc) with + match PackageChecker.main_document display_config typecheck_config tyenv_prim genv sorted_locals (abspath_in, utdoc) with | Ok(pair) -> pair | Error(e) -> raise (ConfigError(e)) in @@ -1749,7 +1777,7 @@ let build if type_check_only then () else - preprocess_and_evaluate ~run_tests:false env libs ast_doc abspath_in abspath_out abspath_dump + preprocess_and_evaluate display_config pdf_config ~page_number_limit ~is_bytecomp_mode output_mode ~run_tests:false env libs ast_doc abspath_in abspath_out abspath_dump ) @@ -1770,22 +1798,24 @@ let test ~(show_full_path : bool) ~(no_default_config : bool) = - error_log_environment (fun () -> + let display_config = Logging.{ show_full_path } in + error_log_environment display_config (fun () -> let curdir = Sys.getcwd () in let input_file_to_test = make_absolute_if_relative ~origin:curdir fpath_in in + let job_directory = get_job_directory input_file_to_test in let extra_config_paths = config_paths_str_opt |> Option.map (String.split_on_char ':') in let output_mode_to_test = make_output_mode text_mode_formats_str_opt in - OptionState.set OptionState.{ - command_state = - TestState{ - input_file_to_test; - output_mode_to_test; - }; - extra_config_paths; - show_full_path; - no_default_config; - }; + let bytecomp = false in + let typecheck_config = + { + is_text_mode = + match output_mode_to_test with + | PdfMode -> false + | TextMode(_) -> true + } + in + let runtime_config = { job_directory } in let library_root = setup_root_dirs ~no_default_config ~extra_config_paths curdir in let abspath_in = input_file_to_test in @@ -1814,58 +1844,58 @@ let test in let extensions = get_candidate_file_extensions output_mode_to_test in - let (tyenv_prim, env) = initialize () in + let (tyenv_prim, env) = initialize ~is_bytecomp_mode:bytecomp output_mode_to_test runtime_config in begin match test_input with | PackageTestInput{ lock = abspath_lock_config; } -> - Logging.lock_config_file abspath_lock_config; + Logging.lock_config_file display_config abspath_lock_config; let lock_config = load_lock_config abspath_lock_config in - let (_config, package) = load_package ~use_test_files:true ~extensions abspath_in in + let (_config, package) = load_package display_config ~use_test_files:true ~extensions abspath_in in let (genv, _configenv, _libs_dep) = - check_depended_packages ~use_test_only_lock:true ~library_root ~extensions tyenv_prim lock_config + check_depended_packages display_config typecheck_config ~use_test_only_lock:true ~library_root ~extensions tyenv_prim lock_config in let libs = - match PackageChecker.main tyenv_prim genv package with + match PackageChecker.main display_config typecheck_config tyenv_prim genv package with | Ok((_ssig, libs)) -> libs | Error(e) -> raise (ConfigError(e)) in - let (env, codebinds) = preprocess_bindings ~run_tests:true env libs in - let _env = evaluate_bindings ~run_tests:true env codebinds in + let (env, codebinds) = preprocess_bindings display_config ~run_tests:true env libs in + let _env = evaluate_bindings display_config ~run_tests:true env codebinds in () | DocumentTestInput{ kind = input_kind; lock = abspath_lock_config; } -> - Logging.lock_config_file abspath_lock_config; + Logging.lock_config_file display_config abspath_lock_config; let lock_config = load_lock_config abspath_lock_config in let (genv, configenv, libs) = - check_depended_packages ~use_test_only_lock:true ~library_root ~extensions tyenv_prim lock_config + check_depended_packages display_config typecheck_config ~use_test_only_lock:true ~library_root ~extensions tyenv_prim lock_config in (* Resolve dependency of the document and the local source files: *) let (sorted_locals, utdoc) = - match OpenFileDependencyResolver.main ~extensions input_kind configenv abspath_in with + match OpenFileDependencyResolver.main display_config ~extensions input_kind configenv abspath_in with | Ok(pair) -> pair | Error(e) -> raise (ConfigError(e)) in (* Typechecking and elaboration: *) let (libs_local, _ast_doc) = - match PackageChecker.main_document tyenv_prim genv sorted_locals (abspath_in, utdoc) with + match PackageChecker.main_document display_config typecheck_config tyenv_prim genv sorted_locals (abspath_in, utdoc) with | Ok(pair) -> pair | Error(e) -> raise (ConfigError(e)) in let libs = List.append libs libs_local in - let (env, codebinds) = preprocess_bindings ~run_tests:true env libs in - let _env = evaluate_bindings ~run_tests:true env codebinds in + let (env, codebinds) = preprocess_bindings display_config ~run_tests:true env libs in + let _env = evaluate_bindings display_config ~run_tests:true env codebinds in () end; let test_results = State.get_all_test_results () in @@ -1932,9 +1962,9 @@ let convert_solutions_to_lock_config (solutions : package_solution list) : LockC (lock_config, Alist.to_list impl_spec_acc) -let extract_attributes_from_document_file (input_kind : input_kind) (abspath_in : abs_path) : (DocumentAttribute.t, config_error) result = +let extract_attributes_from_document_file (display_config : Logging.config) (input_kind : input_kind) (abspath_in : abs_path) : (DocumentAttribute.t, config_error) result = let open ResultMonad in - Logging.begin_to_parse_file abspath_in; + Logging.begin_to_parse_file display_config abspath_in; match input_kind with | InputSatysfi -> let* utsrc = @@ -1995,18 +2025,12 @@ let solve ~(config_paths_str_opt : string option) ~(no_default_config : bool) = - error_log_environment (fun () -> + let display_config = Logging.{ show_full_path } in + error_log_environment display_config (fun () -> let curdir = Sys.getcwd () in let extra_config_paths = config_paths_str_opt |> Option.map (String.split_on_char ':') in - OptionState.set OptionState.{ - command_state = SolveState; - extra_config_paths; - show_full_path; - no_default_config; - }; - let library_root = setup_root_dirs ~no_default_config ~extra_config_paths curdir in let abspath_in = make_absolute_if_relative ~origin:curdir fpath_in in let solve_input = @@ -2071,7 +2095,7 @@ let solve lock = abspath_lock_config; } -> let* DocumentAttribute.{ registry_specs; dependencies } = - extract_attributes_from_document_file input_kind abspath_in + extract_attributes_from_document_file display_config input_kind abspath_in in let dependencies_with_flags = dependencies |> List.map (fun dep -> (SourceDependency, dep)) in return (dependencies_with_flags, abspath_lock_config, registry_specs) @@ -2142,7 +2166,7 @@ let solve ~wget_command ~tar_command ~unzip_command ~library_root impl_spec ) () in - LockConfig.write abspath_lock_config lock_config; + LockConfig.write display_config abspath_lock_config lock_config; return () end in diff --git a/src/frontend/moduleTypechecker.ml b/src/frontend/moduleTypechecker.ml index 11356a3a0..80e7e2494 100644 --- a/src/frontend/moduleTypechecker.ml +++ b/src/frontend/moduleTypechecker.ml @@ -234,10 +234,11 @@ let get_dependency_on_synonym_types (known_syns : SynonymDependencyGraph.Vertex. ) hashset SynonymVertexSet.empty -let bind_types (tyenv : Typeenv.t) (tybinds : untyped_type_binding list) : ((type_name * type_entry) list * (constructor_name * TypeID.t * BoundID.t list * constructor_branch_map) list) ok = +let bind_types (config : typecheck_config) (tyenv : Typeenv.t) (tybinds : untyped_type_binding list) : ((type_name * type_entry) list * (constructor_name * TypeID.t * BoundID.t list * constructor_branch_map) list) ok = let open ResultMonad in let pre = { + config = config; stage = Stage0; type_parameters = TypeParameterMap.empty; row_parameters = RowParameterMap.empty; @@ -410,7 +411,7 @@ let coerce_signature (rng : Range.t) (modsig1 : signature) (absmodsig2 : signatu return (quant2, copy_contents modsig1 modsig2) -let rec typecheck_signature (tyenv : Typeenv.t) (utsig : untyped_signature) : (signature abstracted) ok = +let rec typecheck_signature (config : typecheck_config) (tyenv : Typeenv.t) (utsig : untyped_signature) : (signature abstracted) ok = let open ResultMonad in let (rng, utsigmain) = utsig in match utsigmain with @@ -438,15 +439,15 @@ let rec typecheck_signature (tyenv : Typeenv.t) (utsig : untyped_signature) : (s end | UTSigDecls(utdecls) -> - let* (quant, ssig) = typecheck_declaration_list tyenv utdecls in + let* (quant, ssig) = typecheck_declaration_list config tyenv utdecls in return (quant, ConcStructure(ssig)) | UTSigFunctor((_, modnm), utsig1, utsig2) -> - let* (quant1, modsig1) = typecheck_signature tyenv utsig1 in + let* (quant1, modsig1) = typecheck_signature config tyenv utsig1 in let* absmodsig2 = let mentry = { mod_signature = modsig1; } in let tyenv = tyenv |> Typeenv.add_module modnm mentry in - typecheck_signature tyenv utsig2 + typecheck_signature config tyenv utsig2 in let fsig = { @@ -459,7 +460,7 @@ let rec typecheck_signature (tyenv : Typeenv.t) (utsig : untyped_signature) : (s return (OpaqueIDMap.empty, ConcFunctor(fsig)) | UTSigWith(utsig0, modidents, tybinds) -> - let* (quant0, modsig0) = typecheck_signature tyenv utsig0 in + let* (quant0, modsig0) = typecheck_signature config tyenv utsig0 in let* ssig = match modsig0 with | ConcFunctor(fsig) -> @@ -479,7 +480,7 @@ let rec typecheck_signature (tyenv : Typeenv.t) (utsig : untyped_signature) : (s end ) ssig0 in - let* (tydefs, ctordefs) = bind_types tyenv tybinds in + let* (tydefs, ctordefs) = bind_types config tyenv tybinds in let* (subst, quant) = tydefs |> foldM (fun (subst, quant) (tynm, tentry) -> let* (tyid, kd_expected) = @@ -520,11 +521,11 @@ let rec typecheck_signature (tyenv : Typeenv.t) (utsig : untyped_signature) : (s return (quant, modsig) -and typecheck_declaration_list (tyenv : Typeenv.t) (utdecls : untyped_declaration list) : (StructSig.t abstracted) ok = +and typecheck_declaration_list (config : typecheck_config) (tyenv : Typeenv.t) (utdecls : untyped_declaration list) : (StructSig.t abstracted) ok = let open ResultMonad in let* (quantacc, ssigacc, _) = utdecls |> foldM (fun (quantacc, ssigacc, tyenv) utdecl -> - let* (quant, ssig) = typecheck_declaration tyenv utdecl in + let* (quant, ssig) = typecheck_declaration config tyenv utdecl in let quantacc = unify_quantifier quantacc quant in let* ssigacc = match StructSig.union ssigacc ssig with @@ -538,7 +539,7 @@ and typecheck_declaration_list (tyenv : Typeenv.t) (utdecls : untyped_declaratio return (quantacc, ssigacc) -and typecheck_declaration (tyenv : Typeenv.t) (utdecl : untyped_declaration) : (StructSig.t abstracted) ok = +and typecheck_declaration (config : typecheck_config) (tyenv : Typeenv.t) (utdecl : untyped_declaration) : (StructSig.t abstracted) ok = let open ResultMonad in match utdecl with | UTDeclValue(stage, (_, x), (typarams, rowparams), mty) -> @@ -546,6 +547,7 @@ and typecheck_declaration (tyenv : Typeenv.t) (utdecl : untyped_declaration) : ( let* (rowparammap, _) = RowParameterMap.empty |> add_row_parameters (Level.succ Level.bottom) rowparams in let pre = { + config = config; stage = stage; level = Level.succ Level.bottom; type_parameters = typarammap; @@ -568,6 +570,7 @@ and typecheck_declaration (tyenv : Typeenv.t) (utdecl : untyped_declaration) : ( | UTDeclTypeOpaque((_, tynm), mnkd) -> let pre_init = { + config = config; stage = Stage0; level = Level.bottom; type_parameters = TypeParameterMap.empty; @@ -591,19 +594,19 @@ and typecheck_declaration (tyenv : Typeenv.t) (utdecl : untyped_declaration) : ( return (OpaqueIDMap.singleton tyid kd, ssig) | UTDeclModule((_, modnm), utsig) -> - let* absmodsig = typecheck_signature tyenv utsig in + let* absmodsig = typecheck_signature config tyenv utsig in let (quant, modsig) = absmodsig in let mentry = { mod_signature = modsig; } in let ssig = StructSig.empty |> StructSig.add_module modnm mentry in return (quant, ssig) | UTDeclSignature((_, signm), utsig) -> - let* absmodsig = typecheck_signature tyenv utsig in + let* absmodsig = typecheck_signature config tyenv utsig in let ssig = StructSig.empty |> StructSig.add_signature signm absmodsig in return (OpaqueIDMap.empty, ssig) | UTDeclInclude(utsig) -> - let* absmodsig = typecheck_signature tyenv utsig in + let* absmodsig = typecheck_signature config tyenv utsig in let (quant, modsig) = absmodsig in begin match modsig with @@ -618,6 +621,7 @@ and typecheck_declaration (tyenv : Typeenv.t) (utdecl : untyped_declaration) : ( | UTDeclMacro((_rng_cs, csnm), (_, mmacty)) -> let pre_init = { + config = config; stage = Stage0; level = Level.bottom; type_parameters = TypeParameterMap.empty; @@ -632,7 +636,7 @@ and typecheck_declaration (tyenv : Typeenv.t) (utdecl : untyped_declaration) : ( return (OpaqueIDMap.empty, ssig) -let rec typecheck_module (tyenv : Typeenv.t) (utmod : untyped_module) : (signature abstracted * binding list) ok = +let rec typecheck_module (config : typecheck_config) (tyenv : Typeenv.t) (utmod : untyped_module) : (signature abstracted * binding list) ok = let open ResultMonad in let (rng, utmodmain) = utmod in match utmodmain with @@ -642,17 +646,17 @@ let rec typecheck_module (tyenv : Typeenv.t) (utmod : untyped_module) : (signatu return ((OpaqueIDMap.empty, modsig), []) | UTModBinds(utbinds) -> - let* ((quant, ssig), binds) = typecheck_binding_list tyenv utbinds in + let* ((quant, ssig), binds) = typecheck_binding_list config tyenv utbinds in return ((quant, ConcStructure(ssig)), binds) | UTModFunctor(modident1, utsig1, utmod2) -> let (_, modnm1) = modident1 in - let* absmodsig1 = typecheck_signature tyenv utsig1 in + let* absmodsig1 = typecheck_signature config tyenv utsig1 in let (quant1, modsig1) = absmodsig1 in let* (absmodsig2, _binds2) = let mentry1 = { mod_signature = modsig1; } in let tyenv = tyenv |> Typeenv.add_module modnm1 mentry1 in - typecheck_module tyenv utmod2 + typecheck_module config tyenv utmod2 in let fsig = { @@ -689,7 +693,7 @@ let rec typecheck_module (tyenv : Typeenv.t) (utmod : untyped_module) : (signatu in let* ((_, modsig0), binds) = let mentry0 = { mod_signature = modsig2; } in - typecheck_module (tyenv0 |> Typeenv.add_module modnm0 mentry0) utmod0 + typecheck_module config (tyenv0 |> Typeenv.add_module modnm0 mentry0) utmod0 in let (quant1_subst, modsig_cod1_subst) = absmodsig_cod1 |> SignatureSubtyping.substitute_abstract subst @@ -705,17 +709,17 @@ let rec typecheck_module (tyenv : Typeenv.t) (utmod : untyped_module) : (signatu | UTModCoerce(modident1, utsig2) -> let* mentry1 = find_module tyenv modident1 in let modsig1 = mentry1.mod_signature in - let* absmodsig2 = typecheck_signature tyenv utsig2 in + let* absmodsig2 = typecheck_signature config tyenv utsig2 in let* absmodsig = coerce_signature rng modsig1 absmodsig2 in return (absmodsig, []) -and typecheck_binding_list (tyenv : Typeenv.t) (utbinds : untyped_binding list) : (StructSig.t abstracted * binding list) ok = +and typecheck_binding_list (config : typecheck_config) (tyenv : Typeenv.t) (utbinds : untyped_binding list) : (StructSig.t abstracted * binding list) ok = let open ResultMonad in let* (binds, (quant, ssig)) = let* (bindacc, _tyenv, quantacc, ssigacc) = utbinds |> foldM (fun (bindacc, tyenv, quantacc, ssigacc) utbind -> - let* (binds, (quant, ssig)) = typecheck_binding tyenv utbind in + let* (binds, (quant, ssig)) = typecheck_binding config tyenv utbind in let tyenv = tyenv |> add_to_type_environment_by_signature ssig in let bindacc = Alist.append bindacc binds in let quantacc = unify_quantifier quantacc quant in @@ -753,13 +757,14 @@ and typecheck_nonrec (pre : pre) (tyenv : Typeenv.t) (ident : var_name ranged) ( return (evid, e1, pty) -and typecheck_binding (tyenv : Typeenv.t) (utbind : untyped_binding) : (binding list * StructSig.t abstracted) ok = +and typecheck_binding (config : typecheck_config) (tyenv : Typeenv.t) (utbind : untyped_binding) : (binding list * StructSig.t abstracted) ok = let open ResultMonad in let (_, utbindmain) = utbind in match utbindmain with | UTBindValue(attrs, stage, valbind) -> let pre = { + config = config; stage = stage; type_parameters = TypeParameterMap.empty; row_parameters = RowParameterMap.empty; @@ -844,7 +849,7 @@ and typecheck_binding (tyenv : Typeenv.t) (utbind : untyped_binding) : (binding assert false | UTBindType(tybinds) -> - let* (tydefs, ctordefs) = bind_types tyenv tybinds in + let* (tydefs, ctordefs) = bind_types config tyenv tybinds in let ssig = tydefs |> List.fold_left (fun ssig (tynm, tentry) -> ssig |> StructSig.add_type tynm tentry @@ -855,7 +860,7 @@ and typecheck_binding (tyenv : Typeenv.t) (utbind : untyped_binding) : (binding | UTBindModule(modident, utsigopt2, utmod1) -> let (rng_mod, modnm) = modident in - let* (absmodsig1, binds1) = typecheck_module tyenv utmod1 in + let* (absmodsig1, binds1) = typecheck_module config tyenv utmod1 in let* (quant, modsig) = match utsigopt2 with | None -> @@ -863,7 +868,7 @@ and typecheck_binding (tyenv : Typeenv.t) (utbind : untyped_binding) : (binding | Some(utsig2) -> let (_, modsig1) = absmodsig1 in - let* absmodsig2 = typecheck_signature tyenv utsig2 in + let* absmodsig2 = typecheck_signature config tyenv utsig2 in coerce_signature rng_mod modsig1 absmodsig2 in let ssig = @@ -873,12 +878,12 @@ and typecheck_binding (tyenv : Typeenv.t) (utbind : untyped_binding) : (binding return (binds1, (quant, ssig)) | UTBindSignature((_, signm), utsig) -> - let* absmodsig = typecheck_signature tyenv utsig in + let* absmodsig = typecheck_signature config tyenv utsig in let ssig = StructSig.empty |> StructSig.add_signature signm absmodsig in return ([], (OpaqueIDMap.empty, ssig)) | UTBindInclude(utmod) -> - let* (absmodsig, binds) = typecheck_module tyenv utmod in + let* (absmodsig, binds) = typecheck_module config tyenv utmod in let (quant, modsig) = absmodsig in begin match modsig with @@ -893,6 +898,7 @@ and typecheck_binding (tyenv : Typeenv.t) (utbind : untyped_binding) : (binding | UTBindInlineMacro(_attrs, (rng_cs, csnm), macparams, utast1) -> let pre = { + config = config; stage = Stage1; type_parameters = TypeParameterMap.empty; row_parameters = RowParameterMap.empty; @@ -920,6 +926,7 @@ and typecheck_binding (tyenv : Typeenv.t) (utbind : untyped_binding) : (binding | UTBindBlockMacro(_attrs, (rng_cs, csnm), macparams, utast1) -> let pre = { + config = config; stage = Stage1; type_parameters = TypeParameterMap.empty; row_parameters = RowParameterMap.empty; @@ -945,14 +952,14 @@ and typecheck_binding (tyenv : Typeenv.t) (utbind : untyped_binding) : (binding return (binds, (OpaqueIDMap.empty, ssig)) -let main (tyenv : Typeenv.t) (absmodsig_opt : (signature abstracted) option) (utbinds : untyped_binding list) : (StructSig.t abstracted * binding list) ok = +let main (config : typecheck_config) (tyenv : Typeenv.t) (absmodsig_opt : (signature abstracted) option) (utbinds : untyped_binding list) : (StructSig.t abstracted * binding list) ok = let open ResultMonad in match absmodsig_opt with | None -> - typecheck_binding_list tyenv utbinds + typecheck_binding_list config tyenv utbinds | Some(absmodsig) -> - let* ((_, ssig), binds) = typecheck_binding_list tyenv utbinds in + let* ((_, ssig), binds) = typecheck_binding_list config tyenv utbinds in let rng = Range.dummy "main_bindings" in (* TODO (error): give appropriate ranges *) let* (quant, modsig) = coerce_signature rng (ConcStructure(ssig)) absmodsig in let ssig = diff --git a/src/frontend/moduleTypechecker.mli b/src/frontend/moduleTypechecker.mli index 11fe50b36..cdd331546 100644 --- a/src/frontend/moduleTypechecker.mli +++ b/src/frontend/moduleTypechecker.mli @@ -3,6 +3,6 @@ open Types open StaticEnv open TypeError -val typecheck_signature : Typeenv.t -> untyped_signature -> (signature abstracted, type_error) result +val typecheck_signature : typecheck_config -> Typeenv.t -> untyped_signature -> (signature abstracted, type_error) result -val main : Typeenv.t -> (signature abstracted) option -> untyped_binding list -> (StructSig.t abstracted * binding list, type_error) result +val main : typecheck_config -> Typeenv.t -> (signature abstracted) option -> untyped_binding list -> (StructSig.t abstracted * binding list, type_error) result diff --git a/src/frontend/openFileDependencyResolver.ml b/src/frontend/openFileDependencyResolver.ml index 3d93b80bf..619a44f20 100644 --- a/src/frontend/openFileDependencyResolver.ml +++ b/src/frontend/openFileDependencyResolver.ml @@ -36,7 +36,7 @@ let get_header (extensions : string list) (curdir : string) (headerelem : header return @@ Local(modident, abspath) -let rec register_library_file (extensions : string list) (graph : graph) ~prev:(vertex_prev_opt : vertex option) (abspath : abs_path) : graph ok = +let rec register_library_file (display_config : Logging.config) (extensions : string list) (graph : graph) ~prev:(vertex_prev_opt : vertex option) (abspath : abs_path) : graph ok = let open ResultMonad in match graph |> FileDependencyGraph.get_vertex abspath with | Some(vertex) -> @@ -51,7 +51,7 @@ let rec register_library_file (extensions : string list) (graph : graph) ~prev:( | None -> let curdir = Filename.dirname (get_abs_path_string abspath) in let* utlib = - Logging.begin_to_parse_file abspath; + Logging.begin_to_parse_file display_config abspath; let* utsrc = ParserInterface.process_file abspath |> Result.map_error (fun rng -> FailedToParse(rng)) in match utsrc with | UTLibraryFile(utlib) -> return utlib @@ -75,13 +75,13 @@ let rec register_library_file (extensions : string list) (graph : graph) ~prev:( return graph | Local(_modident_sub, abspath_sub) -> - register_library_file extensions graph ~prev:(Some(vertex)) abspath_sub + register_library_file display_config extensions graph ~prev:(Some(vertex)) abspath_sub ) graph -let register_document_file (extensions : string list) (abspath_in : abs_path) : (graph * untyped_document_file) ok = +let register_document_file (display_config : Logging.config) (extensions : string list) (abspath_in : abs_path) : (graph * untyped_document_file) ok = let open ResultMonad in - Logging.begin_to_parse_file abspath_in; + Logging.begin_to_parse_file display_config abspath_in; let curdir = Filename.dirname (get_abs_path_string abspath_in) in let* utsrc = ParserInterface.process_file abspath_in @@ -101,7 +101,7 @@ let register_document_file (extensions : string list) (abspath_in : abs_path) : return graph | Local(_, abspath_sub) -> - register_library_file extensions graph ~prev:None abspath_sub + register_library_file display_config extensions graph ~prev:None abspath_sub ) FileDependencyGraph.empty in return (graph, utdoc) @@ -132,9 +132,9 @@ let extract_markdown_command_record ~(module_name : module_name) (config : Packa err @@ NoMarkdownConversion(module_name) -let register_markdown_file (configenv : PackageConfig.t GlobalTypeenv.t) (abspath_in : abs_path) : untyped_document_file ok = +let register_markdown_file (display_config : Logging.config) (configenv : PackageConfig.t GlobalTypeenv.t) (abspath_in : abs_path) : untyped_document_file ok = let open ResultMonad in - Logging.begin_to_parse_file abspath_in; + Logging.begin_to_parse_file display_config abspath_in; let* (_docattr, main_module_name_class, md) = match read_file abspath_in with | Ok(data) -> MarkdownParser.decode data |> Result.map_error (fun e -> MarkdownError(e)) @@ -156,15 +156,15 @@ let register_markdown_file (configenv : PackageConfig.t GlobalTypeenv.t) (abspat return utdoc -let main ~(extensions : string list) (input_kind : input_kind) (configenv : PackageConfig.t GlobalTypeenv.t) (abspath_in : abs_path) : ((abs_path * untyped_library_file) list * untyped_document_file) ok = +let main (display_config : Logging.config) ~(extensions : string list) (input_kind : input_kind) (configenv : PackageConfig.t GlobalTypeenv.t) (abspath_in : abs_path) : ((abs_path * untyped_library_file) list * untyped_document_file) ok = let open ResultMonad in let* (graph, utdoc) = match input_kind with | InputSatysfi -> - register_document_file extensions abspath_in + register_document_file display_config extensions abspath_in | InputMarkdown -> - let* utdoc = register_markdown_file configenv abspath_in in + let* utdoc = register_markdown_file display_config configenv abspath_in in return (FileDependencyGraph.empty, utdoc) in let* sorted_locals = diff --git a/src/frontend/openFileDependencyResolver.mli b/src/frontend/openFileDependencyResolver.mli index 992ac7aed..995136f68 100644 --- a/src/frontend/openFileDependencyResolver.mli +++ b/src/frontend/openFileDependencyResolver.mli @@ -4,4 +4,4 @@ open Types open PackageSystemBase open ConfigError -val main : extensions:(string list) -> input_kind -> PackageConfig.t GlobalTypeenv.t -> abs_path -> ((abs_path * untyped_library_file) list * untyped_document_file, config_error) result +val main : Logging.config -> extensions:(string list) -> input_kind -> PackageConfig.t GlobalTypeenv.t -> abs_path -> ((abs_path * untyped_library_file) list * untyped_document_file, config_error) result diff --git a/src/frontend/packageChecker.ml b/src/frontend/packageChecker.ml index d4513c7d3..58b8253c9 100644 --- a/src/frontend/packageChecker.ml +++ b/src/frontend/packageChecker.ml @@ -51,24 +51,24 @@ let add_dependency_to_type_environment ~(package_only : bool) (header : header_e ) tyenv -let typecheck_library_file ~for_struct:(tyenv_for_struct : Typeenv.t) ~for_sig:(tyenv_for_sig : Typeenv.t) (abspath_in : abs_path) (utsig_opt : untyped_signature option) (utbinds : untyped_binding list) : (StructSig.t abstracted * binding list) ok = +let typecheck_library_file (display_config : Logging.config) (config : typecheck_config) ~for_struct:(tyenv_for_struct : Typeenv.t) ~for_sig:(tyenv_for_sig : Typeenv.t) (abspath_in : abs_path) (utsig_opt : untyped_signature option) (utbinds : untyped_binding list) : (StructSig.t abstracted * binding list) ok = let open ResultMonad in let res = - Logging.begin_to_typecheck_file abspath_in; - let* absmodsig_opt = utsig_opt |> optionM (ModuleTypechecker.typecheck_signature tyenv_for_sig) in - let* ret = ModuleTypechecker.main tyenv_for_struct absmodsig_opt utbinds in + Logging.begin_to_typecheck_file display_config abspath_in; + let* absmodsig_opt = utsig_opt |> optionM (ModuleTypechecker.typecheck_signature config tyenv_for_sig) in + let* ret = ModuleTypechecker.main config tyenv_for_struct absmodsig_opt utbinds in Logging.pass_type_check None; return ret in res |> Result.map_error (fun tyerr -> TypeError(tyerr)) -let typecheck_document_file (tyenv : Typeenv.t) (abspath_in : abs_path) (utast : untyped_abstract_tree) : abstract_tree ok = +let typecheck_document_file (display_config : Logging.config) (config : typecheck_config) (tyenv : Typeenv.t) (abspath_in : abs_path) (utast : untyped_abstract_tree) : abstract_tree ok = let open ResultMonad in - Logging.begin_to_typecheck_file abspath_in; - let* (ty, ast) = Typechecker.main Stage1 tyenv utast |> Result.map_error (fun tyerr -> TypeError(tyerr)) in + Logging.begin_to_typecheck_file display_config abspath_in; + let* (ty, ast) = Typechecker.main config Stage1 tyenv utast |> Result.map_error (fun tyerr -> TypeError(tyerr)) in Logging.pass_type_check (Some(Display.show_mono_type ty)); - if OptionState.is_text_mode () then + if config.is_text_mode then if Typechecker.are_unifiable ty (Range.dummy "text-mode", BaseType(StringType)) then return ast else @@ -80,7 +80,7 @@ let typecheck_document_file (tyenv : Typeenv.t) (abspath_in : abs_path) (utast : err (NotADocumentFile(abspath_in, ty)) -let check_library_package (tyenv_prim : Typeenv.t) (genv : global_type_environment) (main_module_name : module_name) (utlibs : (abs_path * untyped_library_file) list) = +let check_library_package (display_config : Logging.config) (config : typecheck_config) (tyenv_prim : Typeenv.t) (genv : global_type_environment) (main_module_name : module_name) (utlibs : (abs_path * untyped_library_file) list) = let open ResultMonad in (* Resolve dependency among the source files in the package: *) @@ -95,13 +95,13 @@ let check_library_package (tyenv_prim : Typeenv.t) (genv : global_type_environme if String.equal modnm main_module_name then let* ((_quant, ssig), binds) = let* tyenv_for_sig = tyenv_prim |> add_dependency_to_type_environment ~package_only:true header genv in - typecheck_library_file ~for_struct:tyenv_for_struct ~for_sig:tyenv_for_sig abspath utsig_opt utbinds + typecheck_library_file display_config config ~for_struct:tyenv_for_struct ~for_sig:tyenv_for_sig abspath utsig_opt utbinds in let genv = genv |> GlobalTypeenv.add modnm ssig in return (genv, Alist.extend libacc (abspath, binds), Some(ssig)) else let* ((_quant, ssig), binds) = - typecheck_library_file ~for_struct:tyenv_for_struct ~for_sig:tyenv_for_struct abspath utsig_opt utbinds + typecheck_library_file display_config config ~for_struct:tyenv_for_struct ~for_sig:tyenv_for_struct abspath utsig_opt utbinds in let genv = genv |> GlobalTypeenv.add modnm ssig in return (genv, Alist.extend libacc (abspath, binds), ssig_opt) @@ -161,16 +161,16 @@ let check_font_package (_main_module_name : module_name) (font_files : font_file return (ssig, Alist.to_list libacc) -let main (tyenv_prim : Typeenv.t) (genv : global_type_environment) (package : untyped_package) : (StructSig.t * (abs_path * binding list) list) ok = +let main (display_config : Logging.config) (config : typecheck_config) (tyenv_prim : Typeenv.t) (genv : global_type_environment) (package : untyped_package) : (StructSig.t * (abs_path * binding list) list) ok = match package with | UTLibraryPackage{ main_module_name; modules = utlibs } -> - check_library_package tyenv_prim genv main_module_name utlibs + check_library_package display_config config tyenv_prim genv main_module_name utlibs | UTFontPackage{ main_module_name; font_files } -> check_font_package main_module_name font_files -let main_document (tyenv_prim : Typeenv.t) (genv : global_type_environment) (sorted_locals : (abs_path * untyped_library_file) list) (abspath_and_utdoc : abs_path * untyped_document_file) : ((abs_path * binding list) list * abstract_tree) ok = +let main_document (display_config : Logging.config) (config : typecheck_config) (tyenv_prim : Typeenv.t) (genv : global_type_environment) (sorted_locals : (abs_path * untyped_library_file) list) (abspath_and_utdoc : abs_path * untyped_document_file) : ((abs_path * binding list) list * abstract_tree) ok = let open ResultMonad in let* (genv, libacc) = sorted_locals |> foldM (fun (genv, libacc) (abspath, utlib) -> @@ -178,7 +178,7 @@ let main_document (tyenv_prim : Typeenv.t) (genv : global_type_environment) (sor let (_, modnm) = modident in let* ((_quant, ssig), binds) = let* tyenv = tyenv_prim |> add_dependency_to_type_environment ~package_only:false header genv in - typecheck_library_file ~for_struct:tyenv ~for_sig:tyenv abspath utsig_opt utbinds + typecheck_library_file display_config config ~for_struct:tyenv ~for_sig:tyenv abspath utsig_opt utbinds in let genv = genv |> GlobalTypeenv.add modnm ssig in return (genv, Alist.extend libacc (abspath, binds)) @@ -190,7 +190,7 @@ let main_document (tyenv_prim : Typeenv.t) (genv : global_type_environment) (sor let* ast_doc = let (abspath, (_attrs, header, utast)) = abspath_and_utdoc in let* tyenv = tyenv_prim |> add_dependency_to_type_environment ~package_only:false header genv in - typecheck_document_file tyenv abspath utast + typecheck_document_file display_config config tyenv abspath utast in return (libs, ast_doc) diff --git a/src/frontend/packageChecker.mli b/src/frontend/packageChecker.mli index f9d966cef..cf7928f42 100644 --- a/src/frontend/packageChecker.mli +++ b/src/frontend/packageChecker.mli @@ -4,6 +4,6 @@ open Types open StaticEnv open ConfigError -val main : type_environment -> global_type_environment -> untyped_package -> (struct_signature * (abs_path * binding list) list, config_error) result +val main : Logging.config -> typecheck_config -> type_environment -> global_type_environment -> untyped_package -> (struct_signature * (abs_path * binding list) list, config_error) result -val main_document : type_environment -> global_type_environment -> (abs_path * untyped_library_file) list -> abs_path * untyped_document_file -> ((abs_path * binding list) list * abstract_tree, config_error) result +val main_document : Logging.config -> typecheck_config -> type_environment -> global_type_environment -> (abs_path * untyped_library_file) list -> abs_path * untyped_document_file -> ((abs_path * binding list) list * abstract_tree, config_error) result diff --git a/src/frontend/packageReader.ml b/src/frontend/packageReader.ml index c86856fc6..e13545cae 100644 --- a/src/frontend/packageReader.ml +++ b/src/frontend/packageReader.ml @@ -23,7 +23,7 @@ let make_path_list_absolute ~(origin : abs_path) (reldirs : string list) : abs_p ) -let main ~(use_test_files : bool) ~(extensions : string list) (absdir_package : abs_path) : (PackageConfig.t * untyped_package) ok = +let main (display_config : Logging.config) ~(use_test_files : bool) ~(extensions : string list) (absdir_package : abs_path) : (PackageConfig.t * untyped_package) ok = let open ResultMonad in let* config = PackageConfig.load absdir_package in let* package = @@ -42,7 +42,7 @@ let main ~(use_test_files : bool) ~(extensions : string list) (absdir_package : let* acc = abspaths |> foldM (fun acc abspath_src -> let* utsrc = - Logging.begin_to_parse_file abspath_src; + Logging.begin_to_parse_file display_config abspath_src; ParserInterface.process_file abspath_src |> Result.map_error (fun e -> FailedToParse(e)) in match utsrc with diff --git a/src/frontend/packageReader.mli b/src/frontend/packageReader.mli index d88185589..0c4e60383 100644 --- a/src/frontend/packageReader.mli +++ b/src/frontend/packageReader.mli @@ -4,6 +4,7 @@ open Types open ConfigError val main : + Logging.config -> use_test_files:bool -> extensions:(string list) -> abs_path -> (PackageConfig.t * untyped_package, config_error) result diff --git a/src/frontend/primitives.cppo.ml b/src/frontend/primitives.cppo.ml index 4cd447e53..6225dcc96 100644 --- a/src/frontend/primitives.cppo.ml +++ b/src/frontend/primitives.cppo.ml @@ -727,13 +727,19 @@ let text_mode_table = ] -let make_environments table = +let make_environments (runtime_config : runtime_config) table = let tyenv = Typeenv.empty |> add_general_default_types |> add_pdf_mode_default_types in - let env : environment = (EvalVarIDMap.empty, ref (StoreIDHashTable.create 128)) in + let env : environment = + { + env_main = EvalVarIDMap.empty; + env_store = ref (StoreIDHashTable.create 128); + env_config = runtime_config; + } + in let temporary_ast = Nil in let (tyenv, env, locacc) = table |> List.fold_left (fun (tyenv, env, acc) (varnm, pty, deff) -> @@ -760,14 +766,14 @@ let resolve_lib_file (libpath : lib_path) = |> Result.map_error (fun candidates -> CannotFindLibraryFile(libpath, candidates)) -let make_pdf_mode_environments () = +let make_pdf_mode_environments (runtime_config : runtime_config) = let open ResultMonad in let* abspath_hyphen = resolve_lib_file (make_lib_path "hyph/english.satysfi-hyph") in default_hyphen_dictionary := LoadHyph.main abspath_hyphen; (* TODO: should depend on the current language *) - return @@ make_environments pdf_mode_table + return @@ make_environments runtime_config pdf_mode_table -let make_text_mode_environments () = +let make_text_mode_environments (runtime_config : runtime_config) = let open ResultMonad in - return @@ make_environments text_mode_table + return @@ make_environments runtime_config text_mode_table diff --git a/src/frontend/primitives.mli b/src/frontend/primitives.mli index e49b54c5d..ede1f85cb 100644 --- a/src/frontend/primitives.mli +++ b/src/frontend/primitives.mli @@ -10,8 +10,8 @@ val itemize_type : unit -> ('a, 'b) typ val get_pdf_mode_initial_context : length -> HorzBox.context_main -val make_pdf_mode_environments : unit -> (Typeenv.t * environment, config_error) result +val make_pdf_mode_environments : runtime_config -> (Typeenv.t * environment, config_error) result -val make_text_mode_environments : unit -> (Typeenv.t * environment, config_error) result +val make_text_mode_environments : runtime_config -> (Typeenv.t * environment, config_error) result val default_radical : HorzBox.radical diff --git a/src/frontend/typechecker.ml b/src/frontend/typechecker.ml index 5aaf6e2e2..b5a3f4d6f 100644 --- a/src/frontend/typechecker.ml +++ b/src/frontend/typechecker.ml @@ -259,6 +259,7 @@ let rec typecheck (pre : pre) (tyenv : Typeenv.t) ((rng, utastmain) : untyped_ab let typecheck_iter ?s:(s = pre.stage) ?l:(l = pre.level) ?p:(p = pre.type_parameters) ?r:(r = pre.row_parameters) ?q:(q = pre.quantifiability) t u = let presub = { + config = pre.config; stage = s; type_parameters = p; row_parameters = r; @@ -438,7 +439,7 @@ let rec typecheck (pre : pre) (tyenv : Typeenv.t) ((rng, utastmain) : untyped_ab let* (tyenv, params) = typecheck_abstraction pre tyenv param_units in let (rng_var, varnm_ctx) = ident_ctx in let (bsty_var, bsty_ret) = - if OptionState.is_text_mode () then + if pre.config.is_text_mode then (TextInfoType, StringType) else (ContextType, InlineBoxesType) @@ -478,7 +479,7 @@ let rec typecheck (pre : pre) (tyenv : Typeenv.t) ((rng, utastmain) : untyped_ab let* (tyenv, params) = typecheck_abstraction pre tyenv param_units in let (rng_var, varnm_ctx) = ident_ctx in let (bsty_var, bsty_ret) = - if OptionState.is_text_mode () then + if pre.config.is_text_mode then (TextInfoType, StringType) else (ContextType, BlockBoxesType) @@ -519,7 +520,7 @@ let rec typecheck (pre : pre) (tyenv : Typeenv.t) ((rng, utastmain) : untyped_ab let* (tyenv, params) = typecheck_abstraction pre tyenv param_units in let (rng_ctx_var, varnm_ctx) = ident_ctx in let (bsty_ctx_var, bsty_ret) = - if OptionState.is_text_mode () then + if pre.config.is_text_mode then (TextInfoType, StringType) else (ContextType, MathBoxesType) @@ -776,7 +777,7 @@ let rec typecheck (pre : pre) (tyenv : Typeenv.t) ((rng, utastmain) : untyped_ab let* (e_ctx, ty_ctx) = typecheck_iter tyenv utast_ctx in let* (eI, tyI) = typecheck_iter tyenv utastI in let (e_ret, bsty_ctx, bsty_ret) = - if OptionState.is_text_mode () then + if pre.config.is_text_mode then (PrimitiveStringifyInline(e_ctx, eI), TextInfoType, StringType) else (PrimitiveReadInline(e_ctx, eI), ContextType, InlineBoxesType) @@ -789,7 +790,7 @@ let rec typecheck (pre : pre) (tyenv : Typeenv.t) ((rng, utastmain) : untyped_ab let* (e_ctx, ty_ctx) = typecheck_iter tyenv utast_ctx in let* (eB, tyB) = typecheck_iter tyenv utastB in let (e_ret, bsty_ctx, bsty_ret) = - if OptionState.is_text_mode () then + if pre.config.is_text_mode then (PrimitiveStringifyBlock(e_ctx, eB), TextInfoType, StringType) else (PrimitiveReadBlock(e_ctx, eB), ContextType, BlockBoxesType) @@ -1236,10 +1237,11 @@ and typecheck_let_mutable (pre : pre) (tyenv : Typeenv.t) (ident : var_name rang return (tyenvI, evid, eI, tyI) -let main (stage : stage) (tyenv : Typeenv.t) (utast : untyped_abstract_tree) : (mono_type * abstract_tree) ok = +let main (config : typecheck_config) (stage : stage) (tyenv : Typeenv.t) (utast : untyped_abstract_tree) : (mono_type * abstract_tree) ok = let open ResultMonad in let pre = { + config = config; stage = stage; type_parameters = TypeParameterMap.empty; row_parameters = RowParameterMap.empty; diff --git a/src/frontend/typechecker.mli b/src/frontend/typechecker.mli index d23b8a2da..d33973108 100644 --- a/src/frontend/typechecker.mli +++ b/src/frontend/typechecker.mli @@ -7,6 +7,6 @@ val typecheck : pre -> type_environment -> untyped_abstract_tree -> (abstract_tr val typecheck_letrec : pre -> type_environment -> untyped_let_binding list -> ((var_name * poly_type * EvalVarID.t * letrec_binding) list, type_error) result -val main : stage -> Typeenv.t -> untyped_abstract_tree -> (mono_type * abstract_tree, type_error) result +val main : typecheck_config -> stage -> Typeenv.t -> untyped_abstract_tree -> (mono_type * abstract_tree, type_error) result val are_unifiable : mono_type -> mono_type -> bool diff --git a/src/frontend/types.cppo.ml b/src/frontend/types.cppo.ml index 6686b3177..5b4c1dfbf 100644 --- a/src/frontend/types.cppo.ml +++ b/src/frontend/types.cppo.ml @@ -332,7 +332,16 @@ module RowParameterMap = Map.Make(String) type row_parameter_map = MustBeBoundRowID.t RowParameterMap.t +type output_mode = + | PdfMode + | TextMode of string list + +type typecheck_config = { + is_text_mode : bool; +} + type pre = { + config : typecheck_config; level : level; type_parameters : type_parameter_map; row_parameters : row_parameter_map; @@ -672,6 +681,10 @@ type page_break_style = | MultiColumn of length list [@@deriving show { with_path = false; }] +type runtime_config = { + job_directory : string; (* Tracks an absolute path to a directory *) +} + type base_constant = | BCUnit | BCBool of bool @@ -711,9 +724,14 @@ and binding = | Bind of stage * rec_or_nonrec | BindTest of EvalVarID.t * string * abstract_tree -and environment = - location EvalVarIDMap.t * (syntactic_value StoreIDHashTable.t) ref - [@printer (fun fmt _ -> Format.fprintf fmt "")] +and environment = { + env_main : location EvalVarIDMap.t; + [@printer (fun fmt _ -> Format.fprintf fmt "")] + env_store : (syntactic_value StoreIDHashTable.t) ref; + [@printer (fun fmt _ -> Format.fprintf fmt "")] + env_config : runtime_config; + [@printer (fun fmt _ -> Format.fprintf fmt "")] +} and location = syntactic_value ref @@ -1315,24 +1333,22 @@ let get_range (rng, _) = rng let add_to_environment (env : environment) (evid : EvalVarID.t) (rfast : location) : environment = - let (valenv, stenvref) = env in - (valenv |> EvalVarIDMap.add evid rfast, stenvref) + { env with env_main = env.env_main |> EvalVarIDMap.add evid rfast } let find_in_environment (env : environment) (evid : EvalVarID.t) : location option = - let (valenv, _) = env in - valenv |> EvalVarIDMap.find_opt evid + env.env_main |> EvalVarIDMap.find_opt evid let register_location (env : environment) (value : syntactic_value) : StoreID.t = - let (_, stenvref) = env in + let stenvref = env.env_store in let stid = StoreID.fresh () in StoreIDHashTable.add (!stenvref) stid value; stid let update_location (env : environment) (stid : StoreID.t) (value : syntactic_value) : unit = - let (_, stenvref) = env in + let stenvref = env.env_store in let stenv = !stenvref in if StoreIDHashTable.mem stenv stid then StoreIDHashTable.replace stenv stid value @@ -1341,7 +1357,7 @@ let update_location (env : environment) (stid : StoreID.t) (value : syntactic_va let find_location_value (env : environment) (stid : StoreID.t) : syntactic_value option = - let (_, stenvref) = env in + let stenvref = env.env_store in StoreIDHashTable.find_opt (!stenvref) stid diff --git a/tools/gencode/gencode.ml b/tools/gencode/gencode.ml index 1126d4e5d..707d99c37 100644 --- a/tools/gencode/gencode.ml +++ b/tools/gencode/gencode.ml @@ -112,6 +112,7 @@ let gen_interps_0 () = inst; params; needs_reducef; + needs_runtime_config; code_interp; code; _ @@ -137,6 +138,9 @@ let gen_interps_0 () = if needs_reducef then begin puts " let reducef = reduce_beta_list in" end; + if needs_runtime_config then begin + puts " let runtime_config = get_runtime_config env in" + end; puts " begin"; default code code_interp |> split_lines |> List.iter (puts " %s"); @@ -160,6 +164,7 @@ let gen_vminstrs () = params; fields; needs_reducef; + needs_runtime_config; code; _ } as def -> @@ -221,6 +226,10 @@ let gen_vminstrs () = puts " let reducef = exec_application %s in" Const.environment end; + if needs_runtime_config then begin + puts " let runtime_config = get_runtime_config %s in" + Const.environment + end; let print_code () = split_lines code |> List.iter (puts " %s"); diff --git a/tools/gencode/instruction.ml b/tools/gencode/instruction.ml index 7d52b074b..52b44059c 100644 --- a/tools/gencode/instruction.ml +++ b/tools/gencode/instruction.ml @@ -36,6 +36,7 @@ type t = { is_pdf_mode_primitive : bool; is_text_mode_primitive : bool; needs_reducef : bool; + needs_runtime_config : bool; no_interp : bool; no_ircode : bool; pp : pp; @@ -56,6 +57,7 @@ let inst ?(is_pdf_mode_primitive = false) ?(is_text_mode_primitive = false) ?(needs_reducef = false) + ?(needs_runtime_config = false) ?no_interp ?(no_ircode = false) ?(pp = Default) @@ -71,6 +73,7 @@ let inst is_pdf_mode_primitive; is_text_mode_primitive; needs_reducef; + needs_runtime_config; no_interp = default (not (is_pdf_mode_primitive || is_text_mode_primitive)) no_interp; no_ircode; pp; diff --git a/tools/gencode/instruction.mli b/tools/gencode/instruction.mli index d26c3f451..46c946693 100644 --- a/tools/gencode/instruction.mli +++ b/tools/gencode/instruction.mli @@ -30,6 +30,7 @@ type t = { is_pdf_mode_primitive : bool; (** Primitive for generating PDFs or not (default: [false]) *) is_text_mode_primitive : bool; (** Primitive for generating texts or not (default: [false]) *) needs_reducef : bool; (** Use [reducef] for evaluating applications (default: [false]) *) + needs_runtime_config : bool; (** Use [runtime_config] for runtime config values (default: [false]) *) no_interp : bool; (** Suppress code generation for [evaluator_.ml] (default: [not is_primitive]) *) no_ircode : bool; (** Suppress code generation for [ir_.ml] (default: [false]) *) pp : pp; (** pretty printer setting *) @@ -54,6 +55,7 @@ val inst : ?is_pdf_mode_primitive:bool -> ?is_text_mode_primitive:bool -> ?needs_reducef:bool + -> ?needs_runtime_config:bool -> ?no_interp:bool -> ?no_ircode:bool -> ?pp:pp diff --git a/tools/gencode/vminst.ml b/tools/gencode/vminst.ml index 0192538e9..bc998a549 100644 --- a/tools/gencode/vminst.ml +++ b/tools/gencode/vminst.ml @@ -523,8 +523,9 @@ make_inline_boxes HorzBox.([ HorzPure(PHGFixedTabular{ param "pageno" ~type_:"int"; ] ~is_pdf_mode_primitive:true + ~needs_runtime_config:true ~code:{| -let abspath = MyUtil.make_abs_path (Filename.concat (OptionState.job_directory ()) relpathstr) in +let abspath = MyUtil.make_abs_path (Filename.concat runtime_config.job_directory relpathstr) in let imgkey = ImageInfo.add_pdf abspath pageno in make_image_key imgkey |} @@ -537,8 +538,9 @@ make_image_key imgkey param "relpath" ~type_:"string"; ] ~is_pdf_mode_primitive:true + ~needs_runtime_config:true ~code:{| -let abspath = MyUtil.make_abs_path (Filename.concat (OptionState.job_directory ()) relpath) in +let abspath = MyUtil.make_abs_path (Filename.concat runtime_config.job_directory relpath) in let imgkey = ImageInfo.add_image abspath in make_image_key imgkey |} @@ -3016,6 +3018,7 @@ Tuple([v1; v2; v3]) ] ~is_pdf_mode_primitive:true ~is_text_mode_primitive:true + ~needs_runtime_config:true ~code:{| let parts = Core.Filename.parts relpath in begin @@ -3025,8 +3028,7 @@ begin () end; let abspath = - let jobdir = OptionState.job_directory () in - Filename.concat jobdir relpath + Filename.concat runtime_config.job_directory relpath in let inc = open_in abspath in let rec aux lineacc =