Skip to content

Commit e2e88ca

Browse files
committed
[perf] Tweak GenericArgs::truncate_to and AliasTerm::own_args
1 parent 40daf23 commit e2e88ca

File tree

5 files changed

+21
-6
lines changed

5 files changed

+21
-6
lines changed

compiler/rustc_hir_analysis/src/delegation.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ fn build_predicates<'tcx>(
233233
ty::GenericPredicates { parent, predicates: tcx.arena.alloc_from_iter(preds) }
234234
}
235235

236+
// NOTE(fmease): Isn't this just a full reimplementation of `EarlyBinder::instantiate`? Investigate.
236237
fn build_generic_args<'tcx>(
237238
tcx: TyCtxt<'tcx>,
238239
sig_id: DefId,
@@ -276,8 +277,7 @@ fn create_generic_args<'tcx>(
276277
tcx.impl_trait_header(parent).unwrap().trait_ref.instantiate_identity().args;
277278

278279
let trait_args = ty::GenericArgs::identity_for_item(tcx, sig_id);
279-
let method_args =
280-
tcx.mk_args_from_iter(trait_args.iter().skip(callee_generics.parent_count));
280+
let method_args = tcx.mk_args(&trait_args[callee_generics.parent_count..]);
281281
let method_args = build_generic_args(tcx, sig_id, def_id, method_args);
282282

283283
tcx.mk_args_from_iter(parent_args.iter().chain(method_args))

compiler/rustc_middle/src/ty/context.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,16 +268,25 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
268268
def_id: DefId,
269269
args: ty::GenericArgsRef<'tcx>,
270270
) -> (ty::TraitRef<'tcx>, &'tcx [ty::GenericArg<'tcx>]) {
271-
assert_matches!(self.def_kind(def_id), DefKind::AssocTy | DefKind::AssocConst);
271+
debug_assert_matches!(self.def_kind(def_id), DefKind::AssocTy | DefKind::AssocConst);
272272
let trait_def_id = self.parent(def_id);
273-
assert_matches!(self.def_kind(trait_def_id), DefKind::Trait);
273+
debug_assert_matches!(self.def_kind(trait_def_id), DefKind::Trait);
274274
let trait_generics = self.generics_of(trait_def_id);
275275
(
276276
ty::TraitRef::new_from_args(self, trait_def_id, args.truncate_to(self, trait_generics)),
277277
&args[trait_generics.count()..],
278278
)
279279
}
280280

281+
fn own_args_for_alias(
282+
self,
283+
def_id: DefId,
284+
args: ty::GenericArgsRef<'tcx>,
285+
) -> &'tcx [ty::GenericArg<'tcx>] {
286+
debug_assert_matches!(self.def_kind(def_id), DefKind::AssocTy | DefKind::AssocConst);
287+
&args[self.generics_of(def_id).parent_count..]
288+
}
289+
281290
fn mk_args(self, args: &[Self::GenericArg]) -> ty::GenericArgsRef<'tcx> {
282291
self.mk_args(args)
283292
}

compiler/rustc_middle/src/ty/generic_args.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ impl<'tcx> GenericArgs<'tcx> {
588588
}
589589

590590
pub fn truncate_to(&self, tcx: TyCtxt<'tcx>, generics: &ty::Generics) -> GenericArgsRef<'tcx> {
591-
tcx.mk_args_from_iter(self.iter().take(generics.count()))
591+
tcx.mk_args(&self[..generics.count()])
592592
}
593593

594594
pub fn print_as_list(&self) -> String {

compiler/rustc_type_ir/src/interner.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,12 @@ pub trait Interner:
182182
args: Self::GenericArgs,
183183
) -> (ty::TraitRef<Self>, Self::GenericArgsSlice);
184184

185+
fn own_args_for_alias(
186+
self,
187+
def_id: Self::DefId,
188+
args: Self::GenericArgs,
189+
) -> Self::GenericArgsSlice;
190+
185191
fn mk_args(self, args: &[Self::GenericArg]) -> Self::GenericArgs;
186192

187193
fn mk_args_from_iter<I, T>(self, args: I) -> T::Output

compiler/rustc_type_ir/src/predicate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ impl<I: Interner> AliasTerm<I> {
687687
/// For example, if this is a projection of `<T as StreamingIterator>::Item<'a>`,
688688
/// then this function would return the slice `['a]` as the own args.
689689
pub fn own_args(self, interner: I) -> I::GenericArgsSlice {
690-
self.trait_ref_and_own_args(interner).1
690+
interner.own_args_for_alias(self.def_id, self.args)
691691
}
692692
}
693693

0 commit comments

Comments
 (0)