Skip to content

Commit 9f74e71

Browse files
authored
perf: avoid kernel env block in realizeConst (#11617)
1 parent ad02aa1 commit 9f74e71

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/Lean/Environment.lean

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2446,14 +2446,14 @@ def replayConsts (dest : Environment) (oldEnv newEnv : Environment) (skipExistin
24462446
}
24472447
checked := dest.checked.map fun kenv =>
24482448
replayKernel
2449-
oldEnv.toKernelEnv.extensions newEnv.toKernelEnv.extensions exts newPrivateConsts kenv
2449+
oldEnv.checked newEnv.checked exts newPrivateConsts kenv
24502450
|>.toOption.getD kenv
24512451
allRealizations := dest.allRealizations.map (sync := true) fun allRealizations =>
24522452
newPrivateConsts.foldl (init := allRealizations) fun allRealizations c =>
24532453
allRealizations.insert c.constInfo.name c
24542454
}
24552455
where
2456-
replayKernel (oldState newState : Array EnvExtensionState)
2456+
replayKernel (oldEnv newEnv : Task Kernel.Environment)
24572457
(exts : Array (EnvExtension EnvExtensionState)) (consts : List AsyncConst)
24582458
(kenv : Kernel.Environment) : Except Kernel.Exception Kernel.Environment := do
24592459
let mut kenv := kenv
@@ -2464,8 +2464,8 @@ where
24642464
-- safety: like in `modifyState`, but that one takes an elab env instead of a kernel env
24652465
extensions := unsafe (ext.modifyStateImpl kenv.extensions <|
24662466
replay
2467-
(ext.getStateImpl oldState)
2468-
(ext.getStateImpl newState)
2467+
(ext.getStateImpl oldEnv.get.extensions)
2468+
(ext.getStateImpl newEnv.get.extensions)
24692469
(consts.map (·.constInfo.name))) }
24702470
for c in consts do
24712471
if skipExisting && (kenv.find? c.constInfo.name).isSome then
@@ -2613,9 +2613,12 @@ def realizeConst (env : Environment) (forConst : Name) (constName : Name)
26132613
let exts ← EnvExtension.envExtensionsRef.get
26142614
-- NOTE: We must ensure that `realizeEnv.localRealizationCtxMap` is not reachable via `res`
26152615
-- (such as by storing `realizeEnv` or `realizeEnv'` in a field or the closure) as `res` will be
2616-
-- stored in a promise in there, creating a cycle.
2616+
-- stored in a promise in there, creating a cycle. The closures stored in
2617+
-- `realizeEnv(').checked` should uphold this property as they are only concerned about the
2618+
-- kernel env but this cannot directly be enforced or checked except through the leak sanitizer
2619+
-- CI build.
26172620
let replayKernel := replayConsts.replayKernel (skipExisting := true)
2618-
realizeEnv.toKernelEnv.extensions realizeEnv'.toKernelEnv.extensions exts newPrivateConsts
2621+
realizeEnv.checked realizeEnv'.checked exts newPrivateConsts
26192622
let res : RealizeConstResult := { newConsts.private := newPrivateConsts, newConsts.public := newPublicConsts, replayKernel, dyn }
26202623
pure (.mk res)
26212624
let some res := res.get? RealizeConstResult | unreachable!

0 commit comments

Comments
 (0)