Skip to content

Commit 093940d

Browse files
committed
Update implementations_of_trait and all_trait_implementations
1 parent 95dfd82 commit 093940d

File tree

3 files changed

+18
-21
lines changed

3 files changed

+18
-21
lines changed

src/librustc/query/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -724,12 +724,12 @@ rustc_queries! {
724724

725725
TypeChecking {
726726
query implementations_of_trait(_: (CrateNum, DefId))
727-
-> Lrc<Vec<DefId>> {
727+
-> &'tcx [DefId] {
728728
no_force
729729
desc { "looking up implementations of a trait in a crate" }
730730
}
731731
query all_trait_implementations(_: CrateNum)
732-
-> Lrc<Vec<DefId>> {
732+
-> &'tcx [DefId] {
733733
desc { "looking up all (?) trait implementations" }
734734
}
735735
}

src/librustc_metadata/cstore_impl.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -208,18 +208,12 @@ provide! { <'tcx> tcx, def_id, other, cdata,
208208

209209
extra_filename => { cdata.root.extra_filename.clone() }
210210

211-
212211
implementations_of_trait => {
213-
let mut result = vec![];
214-
let filter = Some(other);
215-
cdata.get_implementations_for_trait(filter, &mut result);
216-
Lrc::new(result)
212+
cdata.get_implementations_for_trait(tcx, Some(other))
217213
}
218214

219215
all_trait_implementations => {
220-
let mut result = vec![];
221-
cdata.get_implementations_for_trait(None, &mut result);
222-
Lrc::new(result)
216+
cdata.get_implementations_for_trait(tcx, None)
223217
}
224218

225219
visibility => { cdata.get_visibility(def_id.index) }

src/librustc_metadata/decoder.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,31 +1024,34 @@ impl<'a, 'tcx> CrateMetadata {
10241024
.map(|index| self.local_def_id(index)))
10251025
}
10261026

1027-
pub fn get_implementations_for_trait(&self,
1028-
filter: Option<DefId>,
1029-
result: &mut Vec<DefId>) {
1027+
pub fn get_implementations_for_trait(
1028+
&self,
1029+
tcx: TyCtxt<'_, 'tcx, '_>,
1030+
filter: Option<DefId>,
1031+
) -> &'tcx [DefId] {
10301032
if self.proc_macros.is_some() {
10311033
// proc-macro crates export no trait impls.
1032-
return
1034+
return &[]
10331035
}
10341036

10351037
// Do a reverse lookup beforehand to avoid touching the crate_num
10361038
// hash map in the loop below.
10371039
let filter = match filter.map(|def_id| self.reverse_translate_def_id(def_id)) {
10381040
Some(Some(def_id)) => Some((def_id.krate.as_u32(), def_id.index)),
1039-
Some(None) => return,
1041+
Some(None) => return &[],
10401042
None => None,
10411043
};
10421044

10431045
if let Some(filter) = filter {
1044-
if let Some(impls) = self.trait_impls
1045-
.get(&filter) {
1046-
result.extend(impls.decode(self).map(|idx| self.local_def_id(idx)));
1046+
if let Some(impls) = self.trait_impls.get(&filter) {
1047+
tcx.arena.alloc_from_iter(impls.decode(self).map(|idx| self.local_def_id(idx)))
1048+
} else {
1049+
&[]
10471050
}
10481051
} else {
1049-
for impls in self.trait_impls.values() {
1050-
result.extend(impls.decode(self).map(|idx| self.local_def_id(idx)));
1051-
}
1052+
tcx.arena.alloc_from_iter(self.trait_impls.values().flat_map(|impls| {
1053+
impls.decode(self).map(|idx| self.local_def_id(idx))
1054+
}))
10521055
}
10531056
}
10541057

0 commit comments

Comments
 (0)