1
Fork 0

Add cache to FoldEscapingRegions

This commit is contained in:
Michael Goulet 2025-01-20 18:01:05 +00:00
parent 01a26c026d
commit d7a6fdc71f
5 changed files with 144 additions and 1 deletions

View file

@ -3,9 +3,10 @@ use std::ops::ControlFlow;
use derive_where::derive_where;
use rustc_type_ir_macros::{Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic};
use crate::data_structures::DelayedMap;
use crate::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable, shift_region};
use crate::inherent::*;
use crate::visit::{TypeSuperVisitable, TypeVisitable, TypeVisitor};
use crate::visit::{TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor};
use crate::{self as ty, Interner};
/// A closure can be modeled as a struct that looks like:
@ -471,6 +472,7 @@ impl<I: Interner> CoroutineClosureSignature<I> {
interner: cx,
region: env_region,
debruijn: ty::INNERMOST,
cache: Default::default(),
});
Ty::new_tup_from_iter(
cx,
@ -498,6 +500,10 @@ struct FoldEscapingRegions<I: Interner> {
interner: I,
debruijn: ty::DebruijnIndex,
region: I::Region,
// Depends on `debruijn` because we may have types with regions of different
// debruijn depths depending on the binders we've entered.
cache: DelayedMap<(ty::DebruijnIndex, I::Ty), I::Ty>,
}
impl<I: Interner> TypeFolder<I> for FoldEscapingRegions<I> {
@ -505,6 +511,18 @@ impl<I: Interner> TypeFolder<I> for FoldEscapingRegions<I> {
self.interner
}
fn fold_ty(&mut self, t: I::Ty) -> I::Ty {
if !t.has_vars_bound_at_or_above(self.debruijn) {
t
} else if let Some(&t) = self.cache.get(&(self.debruijn, t)) {
t
} else {
let res = t.super_fold_with(self);
assert!(self.cache.insert((self.debruijn, t), res));
res
}
}
fn fold_binder<T>(&mut self, t: ty::Binder<I, T>) -> ty::Binder<I, T>
where
T: TypeFoldable<I>,