@@ -59,18 +59,22 @@ let is_restricted_name =
5959 fun s -> Str. (string_match rex (Id. to_string s) 0 )
6060
6161
62- let glob_environment : Environ.env S.component =
62+ let glob_environment : Environ.env option S.component =
6363 S. declare_component ~name: " coq-elpi:glob-environment" ~descriptor: interp_state
64- ~pp: (fun _ _ -> () ) ~init: (fun () -> Global. env () )
65- ~start: (fun _ -> Global. env () ) ()
64+ ~pp: (fun _ _ -> () ) ~init: (fun () -> None )
65+ ~start: (fun _ -> Some (Global. env () )) ()
66+
67+ (* Since Accumulate runs before the interpreter starts, the state
68+ may be empty: ~start not called, ~init called too early *)
69+ let ensure_some f = function None -> Some (f (Global. env () )) | Some x -> Some (f x)
6670
6771let push_env state name =
6872 let open Context.Rel.Declaration in
69- S. update glob_environment state (Environ. push_rel (LocalAssum (Context. make_annot name Sorts. Relevant ,Constr. mkProp)))
73+ S. update glob_environment state (ensure_some ( Environ. push_rel (LocalAssum (Context. make_annot name Sorts. Relevant ,Constr. mkProp) )))
7074let pop_env state =
71- S. update glob_environment state (Environ. pop_rel_context 1 )
75+ S. update glob_environment state (ensure_some ( Environ. pop_rel_context 1 ) )
7276
73- let get_glob_env state = S. get glob_environment state
77+ let get_glob_env state = Option. get @@ ensure_some ( fun x -> x) @@ S. get glob_environment state
7478
7579(* XXX: I don't get why we use a coq_ctx here *)
7680let under_ctx name ty bo gterm2lp ~depth state x =
@@ -396,7 +400,7 @@ let coq_quotation ~depth state loc src =
396400 Constrintern. intern_constr (get_glob_env state) (get_sigma state) ce
397401 with e ->
398402 CErrors. user_err
399- Pp. (str(API.Ast.Loc. show loc) ++ str " : " ++ spc() ++ CErrors. print_no_report e)
403+ Pp. (str(API.Ast.Loc. show loc) ++ spc() ++ CErrors. print_no_report e)
400404 in
401405 gterm2lp ~depth state glob
402406
0 commit comments