@@ -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 }
24552455where
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