Keep TyCtxtFeed
around longer in the resolver
This commit is contained in:
parent
2149c45e03
commit
31d0a644be
@ -74,6 +74,7 @@ use std::cmp::Ordering;
|
||||
use std::fmt;
|
||||
use std::hash::{Hash, Hasher};
|
||||
use std::iter;
|
||||
use std::marker::PhantomData;
|
||||
use std::mem;
|
||||
use std::ops::{Bound, Deref};
|
||||
|
||||
@ -519,6 +520,23 @@ pub struct TyCtxtFeed<'tcx, KEY: Copy> {
|
||||
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> {
|
||||
pub fn feed_unit_query(self) -> TyCtxtFeed<'tcx, ()> {
|
||||
TyCtxtFeed { tcx: self, key: () }
|
||||
@ -544,6 +562,23 @@ impl<'tcx, KEY: Copy> TyCtxtFeed<'tcx, KEY> {
|
||||
pub fn 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> {
|
||||
|
@ -85,7 +85,8 @@ pub use self::consts::{
|
||||
Const, ConstData, ConstInt, ConstKind, Expr, ScalarInt, UnevaluatedConst, ValTree,
|
||||
};
|
||||
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::list::List;
|
||||
|
Loading…
x
Reference in New Issue
Block a user