Skip to content

Commit a9bbe52

Browse files
Merge PR #22292: Cleanups around kernel side of Require
Reviewed-by: ppedrot Co-authored-by: ppedrot <ppedrot@users.noreply.github.com>
2 parents 442085d + 382f08d commit a9bbe52

10 files changed

Lines changed: 72 additions & 44 deletions

File tree

kernel/safe_typing.ml

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1694,13 +1694,23 @@ let export ~output_native_objects senv dir =
16941694
let vmlib = Vmlibrary.export @@ Environ.vm_library senv.env in
16951695
mp, lib, vmlib, (ast, symbols)
16961696

1697-
let import lib vmtab vodigest senv =
1698-
let senv = check_flags_for_library lib senv in
1699-
let required = check_required senv.required lib.comp_deps in
1700-
if DirPath.equal (ModPath.dp senv.modpath) lib.comp_name then
1697+
let import_gen ~replaying lib vmtab vodigest senv =
1698+
let () = if DirPath.equal (ModPath.dp senv.modpath) lib.comp_name then
17011699
CErrors.user_err
17021700
Pp.(strbrk "Cannot load a library with the same name as the current one ("
1703-
++ DirPath.print lib.comp_name ++ str").");
1701+
++ DirPath.print lib.comp_name ++ str").")
1702+
in
1703+
let senv = check_flags_for_library lib senv in
1704+
let required = check_required senv.required lib.comp_deps in
1705+
let required =
1706+
if DirPath.Map.mem lib.comp_name required then
1707+
if replaying then
1708+
(* only happens in close_section, could probably be done in a saner way *)
1709+
required
1710+
else
1711+
CErrors.anomaly Pp.(str "Double kernel import of " ++ DirPath.print lib.comp_name ++ str ".")
1712+
else DirPath.Map.add lib.comp_name { req_root = true; req_digest = vodigest } required
1713+
in
17041714
let mp = MPfile lib.comp_name in
17051715
let mb = lib.comp_mod in
17061716
let univs = lib.comp_univs in
@@ -1724,12 +1734,6 @@ let import lib vmtab vodigest senv =
17241734
{custom with rev_reimport = (lib,vmtab,vodigest) :: custom.rev_reimport}))
17251735
senv.sections
17261736
in
1727-
let required =
1728-
if DirPath.Map.mem lib.comp_name required then
1729-
(* should probably be an error, we are requiring the same library twice *)
1730-
required
1731-
else DirPath.Map.add lib.comp_name { req_root = true; req_digest = vodigest } required
1732-
in
17331737
mp,
17341738
{ senv with
17351739
env;
@@ -1741,6 +1745,9 @@ let import lib vmtab vodigest senv =
17411745
sections;
17421746
}
17431747

1748+
let import lib vmtab vodigest senv =
1749+
import_gen ~replaying:false lib vmtab vodigest senv
1750+
17441751
(** {6 Interactive sections} *)
17451752

17461753
let open_section senv =
@@ -1770,8 +1777,10 @@ let close_section senv =
17701777
rev_reimport; rev_revstruct = revstruct; rev_paramresolver = paramresolver } = revert in
17711778
let env = if Environ.rewrite_rules_allowed env0 then Environ.allow_rewrite_rules env else env in
17721779
let senv = { senv with env; revstruct; sections; univ; qualities; elims; objlabels; paramresolver } in
1773-
(* Second phase: replay Requires *)
1774-
let senv = List.fold_left (fun senv (lib,vmtab,vodigest) -> snd (import lib vmtab vodigest senv))
1780+
(* Second phase: replay Requires
1781+
should probably be done in a saner way that doesn't need the [replaying] flag *)
1782+
let senv = List.fold_left (fun senv (lib,vmtab,vodigest) ->
1783+
snd (import_gen ~replaying:true lib vmtab vodigest senv))
17751784
senv (List.rev rev_reimport)
17761785
in
17771786
(* Third phase: replay the discharged section contents *)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-R . Test22292
2+
3+
file1.v
4+
file2.v
5+
file3.v
6+
file3bad.v
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Global Unset Universe Checking.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Require file1.
2+
Universe u. Constraint u < u.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Require file2.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Require file1.
2+
Set Universe Checking.
3+
Fail Require file2.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env bash
2+
3+
. ../template/path-init.sh
4+
5+
rm -rf _test
6+
mkdir _test
7+
find . -maxdepth 1 -not -name . -not -name _test -exec cp -r '{}' -t _test ';'
8+
cd _test
9+
10+
rocq makefile -f _CoqProject -o Makefile
11+
12+
export COQEXTRAFLAGS='-native-compiler no' # loading flags not supported by separate native compiler
13+
make

vernac/declaremods.ml

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,22 +1641,9 @@ let declare_include me_asts =
16411641
user_err Pp.(str "Include is not allowed inside sections.");
16421642
RawIncludeOps.Interp.declare_include me_asts
16431643

1644-
let register_library dir cenv (objs:library_objects) digest vmtab =
1644+
let register_library dir (objs:library_objects) =
16451645
let mp = MPfile dir in
16461646
let sp = path_of_file dir in
1647-
let () =
1648-
try
1649-
(* If the library was loaded inside a module or section, the
1650-
end_segment will replay the library object for non-kernel
1651-
effects but the kernel did not forget the library. *)
1652-
ignore(Global.lookup_module mp);
1653-
with Not_found ->
1654-
begin
1655-
let mp' = Global.import cenv vmtab digest in
1656-
if not (ModPath.equal mp mp') then
1657-
anomaly (Pp.str "Unexpected disk module name.")
1658-
end
1659-
in
16601647
let sobjs,keepobjs,escapeobjs = objs in
16611648
InterpVisitor.load_module 1 sp mp ([],Objs sobjs);
16621649
InterpVisitor.load_escape 1 sp mp escapeobjs;

vernac/declaremods.mli

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,7 @@ val start_modtype :
131131

132132
val end_modtype : unit -> ModPath.t
133133

134-
val register_library :
135-
library_name ->
136-
Safe_typing.compiled_library -> library_objects -> Safe_typing.vodigest ->
137-
Vmlibrary.on_disk ->
138-
unit
134+
val register_library : library_name -> library_objects -> unit
139135

140136
(** [import_module export mp] imports the module [mp].
141137
It modifies Nametab and performs the [open_object] function for

vernac/library.ml

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -370,11 +370,7 @@ let register_library m =
370370
let l = m.library_data in
371371
Declaremods.Interp.register_library
372372
m.library_name
373-
l.md_compiled
374-
l.md_objects
375-
m.library_digests
376-
m.library_vm
377-
;
373+
l.md_objects;
378374
register_native_library m.library_name
379375

380376
let register_library_syntax (root, m) =
@@ -389,7 +385,7 @@ let register_library_syntax (root, m) =
389385
the module or module type
390386
- not called from a library (i.e. a module identified with a file) *)
391387
let load_require _ needed =
392-
List.iter register_library needed
388+
register_library needed
393389

394390
(* [needed] is the ordered list of libraries not already loaded *)
395391
let cache_require o =
@@ -399,7 +395,7 @@ let discharge_require o = Some o
399395

400396
(* open_function is never called from here because an Anticipate object *)
401397

402-
type require_obj = library_t list
398+
type require_obj = library_t
403399

404400
let in_require : require_obj -> obj =
405401
declare_object
@@ -411,7 +407,7 @@ let in_require : require_obj -> obj =
411407
classify_function = (fun o -> Anticipate) }
412408

413409
let load_require_syntax _ needed =
414-
List.iter register_library_syntax needed
410+
register_library_syntax needed
415411

416412
let cache_require_syntax o =
417413
load_require_syntax 1 o
@@ -420,8 +416,7 @@ let discharge_require_syntax o = Some o
420416

421417
(* open_function is never called from here because an Anticipate object *)
422418

423-
type require_obj_syntax = (bool * library_t) list
424-
419+
type require_obj_syntax = bool * library_t
425420
let in_require_syntax : require_obj_syntax -> obj =
426421
declare_object
427422
{(default_object "REQUIRE-SYNTAX") with
@@ -440,14 +435,29 @@ let warn_require_in_module =
440435
(fun () -> strbrk "Use of “Require” inside a module is fragile." ++ spc() ++
441436
strbrk "It is not recommended to use this functionality in finished proof scripts.")
442437

438+
let kernel_load_require m =
439+
let l = m.library_data in
440+
let mp' = Global.import l.md_compiled m.library_vm m.library_digests in
441+
if not (ModPath.equal (MPfile m.library_name) mp') then
442+
anomaly (Pp.str "Unexpected disk module name.")
443+
443444
let require_library_from_dirpath needed =
444445
if Lib.is_module_or_modtype () then warn_require_in_module ();
445-
Lib.add_leaf (in_require needed)
446+
(* Note that putting the list in the libobject would need to split the iter
447+
(ie do [List.iter kernel_load_require needed; List.iter add_leaf needed])
448+
which changes behaviour because libobjects can change kernel flags
449+
(eg Global Unset Universe Checking).
450+
TBH I'm not sure how much we care about preserving such behaviours
451+
if it ever becomes inconvenient though. *)
452+
List.iter (fun m ->
453+
kernel_load_require m;
454+
Lib.add_leaf (in_require m))
455+
needed
446456

447457
let require_library_syntax_from_dirpath ~intern modrefl =
448458
let needed, contents = List.fold_left (rec_intern_library ~intern) ([], DirPath.Map.empty) modrefl in
449459
let needed = List.rev_map (fun (root, dir) -> root, DirPath.Map.find dir contents) needed in
450-
Lib.add_leaf (in_require_syntax needed);
460+
List.iter (fun m -> Lib.add_leaf (in_require_syntax m)) needed;
451461
List.map snd needed
452462

453463
(************************************************************************)

0 commit comments

Comments
 (0)