Keep TyCtxtFeed
around longer in the resolver
This commit is contained in:
parent
2149c45e03
commit
31d0a644be
2 changed files with 37 additions and 1 deletions
|
@ -74,6 +74,7 @@ use std::cmp::Ordering;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
use std::marker::PhantomData;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::ops::{Bound, Deref};
|
use std::ops::{Bound, Deref};
|
||||||
|
|
||||||
|
@ -519,6 +520,23 @@ pub struct TyCtxtFeed<'tcx, KEY: Copy> {
|
||||||
key: KEY,
|
key: KEY,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The same as `TyCtxtFeed`, but does not contain a `TyCtxt`.
|
||||||
|
/// Use this to pass around when you have a `TyCtxt` elsewhere.
|
||||||
|
/// Just an optimization to save space and not store hundreds of
|
||||||
|
/// `TyCtxtFeed` in the resolver.
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub struct Feed<'tcx, KEY: Copy> {
|
||||||
|
_tcx: PhantomData<TyCtxt<'tcx>>,
|
||||||
|
// Do not allow direct access, as downstream code must not mutate this field.
|
||||||
|
key: KEY,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: fmt::Debug + Copy> fmt::Debug for Feed<'_, T> {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
self.key.fmt(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> TyCtxt<'tcx> {
|
impl<'tcx> TyCtxt<'tcx> {
|
||||||
pub fn feed_unit_query(self) -> TyCtxtFeed<'tcx, ()> {
|
pub fn feed_unit_query(self) -> TyCtxtFeed<'tcx, ()> {
|
||||||
TyCtxtFeed { tcx: self, key: () }
|
TyCtxtFeed { tcx: self, key: () }
|
||||||
|
@ -544,6 +562,23 @@ impl<'tcx, KEY: Copy> TyCtxtFeed<'tcx, KEY> {
|
||||||
pub fn key(&self) -> KEY {
|
pub fn key(&self) -> KEY {
|
||||||
self.key
|
self.key
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn downgrade(self) -> Feed<'tcx, KEY> {
|
||||||
|
Feed { _tcx: PhantomData, key: self.key }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, KEY: Copy> Feed<'tcx, KEY> {
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn key(&self) -> KEY {
|
||||||
|
self.key
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn upgrade(self, tcx: TyCtxt<'tcx>) -> TyCtxtFeed<'tcx, KEY> {
|
||||||
|
TyCtxtFeed { tcx, key: self.key }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TyCtxtFeed<'tcx, LocalDefId> {
|
impl<'tcx> TyCtxtFeed<'tcx, LocalDefId> {
|
||||||
|
|
|
@ -85,7 +85,8 @@ pub use self::consts::{
|
||||||
Const, ConstData, ConstInt, ConstKind, Expr, ScalarInt, UnevaluatedConst, ValTree,
|
Const, ConstData, ConstInt, ConstKind, Expr, ScalarInt, UnevaluatedConst, ValTree,
|
||||||
};
|
};
|
||||||
pub use self::context::{
|
pub use self::context::{
|
||||||
tls, CtxtInterners, DeducedParamAttrs, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed,
|
tls, CtxtInterners, DeducedParamAttrs, Feed, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt,
|
||||||
|
TyCtxtFeed,
|
||||||
};
|
};
|
||||||
pub use self::instance::{Instance, InstanceDef, ShortInstance, UnusedGenericParams};
|
pub use self::instance::{Instance, InstanceDef, ShortInstance, UnusedGenericParams};
|
||||||
pub use self::list::List;
|
pub use self::list::List;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue