提交 0195812a 编写于 作者: B bors

Auto merge of #55604 - nnethercote:avoid-associated_items-Box, r=nnethercote

Avoid the Box in `TyCtxt::associated_items`.

This reduces instruction counts on `packed_simd` by 2%.

r? @nikomatsakis
......@@ -366,7 +366,7 @@ pub fn is_from_trait(&self) -> bool {
pub fn items(
&self,
tcx: TyCtxt<'a, 'gcx, 'tcx>,
) -> impl Iterator<Item = ty::AssociatedItem> + 'a {
) -> ty::AssociatedItemsIterator<'a, 'gcx, 'tcx> {
tcx.associated_items(self.def_id())
}
......
......@@ -2674,10 +2674,17 @@ pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<usiz
pub fn associated_items(
self,
def_id: DefId,
) -> impl Iterator<Item = AssociatedItem> + 'a {
let def_ids = self.associated_item_def_ids(def_id);
Box::new((0..def_ids.len()).map(move |i| self.associated_item(def_ids[i])))
as Box<dyn Iterator<Item = AssociatedItem> + 'a>
) -> AssociatedItemsIterator<'a, 'gcx, 'tcx> {
// Ideally, we would use `-> impl Iterator` here, but it falls
// afoul of the conservative "capture [restrictions]" we put
// in place, so we use a hand-written iterator.
//
// [restrictions]: https://github.com/rust-lang/rust/issues/34511#issuecomment-373423999
AssociatedItemsIterator {
tcx: self,
def_ids: self.associated_item_def_ids(def_id),
next_index: 0,
}
}
/// Returns `true` if the impls are the same polarity and the trait either
......@@ -2874,6 +2881,22 @@ pub fn adjust_ident(self, mut ident: Ident, scope: DefId, block: NodeId) -> (Ide
}
}
pub struct AssociatedItemsIterator<'a, 'gcx: 'tcx, 'tcx: 'a> {
tcx: TyCtxt<'a, 'gcx, 'tcx>,
def_ids: Lrc<Vec<DefId>>,
next_index: usize,
}
impl Iterator for AssociatedItemsIterator<'_, '_, '_> {
type Item = AssociatedItem;
fn next(&mut self) -> Option<AssociatedItem> {
let def_id = self.def_ids.get(self.next_index)?;
self.next_index += 1;
Some(self.tcx.associated_item(*def_id))
}
}
impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
pub fn with_freevars<T, F>(self, fid: NodeId, f: F) -> T where
F: FnOnce(&[hir::Freevar]) -> T,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册