Skip to content

Commit ec415c0

Browse files
committed
Cache ItemRef computation
1 parent a83bb4f commit ec415c0

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

frontend/exporter/src/state.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ mod types {
153153
pub promoteds: TypeMap<PromotedFullDefsMapper>,
154154
/// Cache the `Ty` translations.
155155
pub tys: HashMap<ty::Ty<'tcx>, Ty>,
156+
/// Cache the `ItemRef` translations.
157+
pub item_refs: HashMap<(RDefId, ty::GenericArgsRef<'tcx>), ItemRef>,
156158
/// Cache the trait resolution engine for each item.
157159
pub predicate_searcher: Option<crate::traits::PredicateSearcher<'tcx>>,
158160
/// Cache of trait refs to resolved impl expressions.

frontend/exporter/src/traits.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,10 @@ pub fn translate_item_ref<'tcx, S: UnderOwnerState<'tcx>>(
259259
def_id: RDefId,
260260
generics: ty::GenericArgsRef<'tcx>,
261261
) -> ItemRef {
262+
let key = (def_id, generics);
263+
if let Some(item) = s.with_cache(|cache| cache.item_refs.get(&key).cloned()) {
264+
return item;
265+
}
262266
let mut impl_exprs = solve_item_required_traits(s, def_id, generics);
263267
let mut generic_args = generics.sinto(s);
264268

@@ -289,13 +293,17 @@ pub fn translate_item_ref<'tcx, S: UnderOwnerState<'tcx>>(
289293
impl_exprs.drain(0..num_trait_trait_clauses);
290294
}
291295

292-
(ItemRefContents {
296+
let content = ItemRefContents {
293297
def_id: def_id.sinto(s),
294298
generic_args,
295299
impl_exprs,
296300
in_trait: trait_info,
297-
})
298-
.intern(s)
301+
};
302+
let item = content.intern(s);
303+
s.with_cache(|cache| {
304+
cache.item_refs.insert(key, item.clone());
305+
});
306+
item
299307
}
300308

301309
/// Solve the trait obligations for a specific item use (for example, a method call, an ADT, etc.)

0 commit comments

Comments
 (0)