Skip to content

Commit 96e46c6

Browse files
committed
Update implementations_of_trait and all_trait_implementations
1 parent 4d282a3 commit 96e46c6

File tree

3 files changed

+18
-21
lines changed

3 files changed

+18
-21
lines changed

src/librustc/query/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -721,12 +721,12 @@ rustc_queries! {
721721

722722
TypeChecking {
723723
query implementations_of_trait(_: (CrateNum, DefId))
724-
-> Lrc<Vec<DefId>> {
724+
-> &'tcx [DefId] {
725725
no_force
726726
desc { "looking up implementations of a trait in a crate" }
727727
}
728728
query all_trait_implementations(_: CrateNum)
729-
-> Lrc<Vec<DefId>> {
729+
-> &'tcx [DefId] {
730730
desc { "looking up all (?) trait implementations" }
731731
}
732732
}

src/librustc_metadata/cstore_impl.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -206,18 +206,12 @@ provide! { <'tcx> tcx, def_id, other, cdata,
206206

207207
extra_filename => { cdata.root.extra_filename.clone() }
208208

209-
210209
implementations_of_trait => {
211-
let mut result = vec![];
212-
let filter = Some(other);
213-
cdata.get_implementations_for_trait(filter, &mut result);
214-
Lrc::new(result)
210+
cdata.get_implementations_for_trait(tcx, Some(other))
215211
}
216212

217213
all_trait_implementations => {
218-
let mut result = vec![];
219-
cdata.get_implementations_for_trait(None, &mut result);
220-
Lrc::new(result)
214+
cdata.get_implementations_for_trait(tcx, None)
221215
}
222216

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

src/librustc_metadata/decoder.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -1009,31 +1009,34 @@ impl<'a, 'tcx> CrateMetadata {
10091009
.map(|index| self.local_def_id(index)))
10101010
}
10111011

1012-
pub fn get_implementations_for_trait(&self,
1013-
filter: Option<DefId>,
1014-
result: &mut Vec<DefId>) {
1012+
pub fn get_implementations_for_trait(
1013+
&self,
1014+
tcx: TyCtxt<'_, 'tcx, '_>,
1015+
filter: Option<DefId>,
1016+
) -> &'tcx [DefId] {
10151017
if self.proc_macros.is_some() {
10161018
// proc-macro crates export no trait impls.
1017-
return
1019+
return &[]
10181020
}
10191021

10201022
// Do a reverse lookup beforehand to avoid touching the crate_num
10211023
// hash map in the loop below.
10221024
let filter = match filter.map(|def_id| self.reverse_translate_def_id(def_id)) {
10231025
Some(Some(def_id)) => Some((def_id.krate.as_u32(), def_id.index)),
1024-
Some(None) => return,
1026+
Some(None) => return &[],
10251027
None => None,
10261028
};
10271029

10281030
if let Some(filter) = filter {
1029-
if let Some(impls) = self.trait_impls
1030-
.get(&filter) {
1031-
result.extend(impls.decode(self).map(|idx| self.local_def_id(idx)));
1031+
if let Some(impls) = self.trait_impls.get(&filter) {
1032+
tcx.arena.alloc_from_iter(impls.decode(self).map(|idx| self.local_def_id(idx)))
1033+
} else {
1034+
&[]
10321035
}
10331036
} else {
1034-
for impls in self.trait_impls.values() {
1035-
result.extend(impls.decode(self).map(|idx| self.local_def_id(idx)));
1036-
}
1037+
tcx.arena.alloc_from_iter(self.trait_impls.values().flat_map(|impls| {
1038+
impls.decode(self).map(|idx| self.local_def_id(idx))
1039+
}))
10371040
}
10381041
}
10391042

0 commit comments

Comments
 (0)