Skip to content

Commit a80df23

Browse files
committed
fix: use a custom environment extension for LCNF decls
1 parent a54872f commit a80df23

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

src/Lean/Compiler/LCNF/PhaseExt.lean

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,38 @@ abbrev DeclExtState := PHashMap Name Decl
1313
private abbrev declLt (a b : Decl) :=
1414
Name.quickLt a.name b.name
1515

16-
private abbrev sortDecls (decls : Array Decl) : Array Decl :=
16+
private def sortedDecls (s : DeclExtState) : Array Decl :=
17+
let decls := s.foldl (init := #[]) fun ps _ v => ps.push v
1718
decls.qsort declLt
1819

1920
private abbrev findAtSorted? (decls : Array Decl) (declName : Name) : Option Decl :=
2021
let tmpDecl : Decl := default
2122
let tmpDecl := { tmpDecl with name := declName }
2223
decls.binSearch tmpDecl declLt
2324

24-
abbrev DeclExt := SimplePersistentEnvExtension Decl DeclExtState
25-
26-
def mkDeclExt (name : Name := by exact decl_name%) : IO DeclExt := do
27-
registerSimplePersistentEnvExtension {
28-
name := name
29-
addImportedFn := fun _ => {}
30-
addEntryFn := fun decls decl => decls.insert decl.name decl
31-
toArrayFn := (sortDecls ·.toArray)
32-
asyncMode := .sync -- compilation is non-parallel anyway
33-
replay? := some <| SimplePersistentEnvExtension.replayOfFilter
34-
(fun s d => !s.contains d.name) (fun decls decl => decls.insert decl.name decl)
25+
def DeclExt := PersistentEnvExtension Decl Decl DeclExtState
26+
27+
instance : Inhabited DeclExt :=
28+
inferInstanceAs (Inhabited (PersistentEnvExtension Decl Decl DeclExtState))
29+
30+
def mkDeclExt (name : Name := by exact decl_name%) : IO DeclExt :=
31+
registerPersistentEnvExtension {
32+
name,
33+
mkInitial := pure {},
34+
addImportedFn := fun _ => pure {},
35+
addEntryFn := fun s decl => s.insert decl.name decl
36+
exportEntriesFn := sortedDecls
37+
saveEntriesFn := sortedDecls
38+
statsFn := fun s =>
39+
let numEntries := s.foldl (init := 0) (fun count _ _ => count + 1)
40+
format "number of local entries: " ++ format numEntries
41+
asyncMode := .sync,
42+
replay? := some <| fun oldState newState _ otherState =>
43+
newState.foldl (init := otherState) fun otherState k v =>
44+
if oldState.contains k then
45+
otherState
46+
else
47+
otherState.insert k v
3548
}
3649

3750
builtin_initialize baseExt : DeclExt ← mkDeclExt

0 commit comments

Comments
 (0)