Skip to content

Commit 0525cf9

Browse files
committed
rustc_metadata: Cleanup generation of crate dependency lists
1 parent f453d11 commit 0525cf9

File tree

3 files changed

+28
-33
lines changed

3 files changed

+28
-33
lines changed

src/librustc_metadata/creader.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,7 @@ impl<'a> CrateLoader<'a> {
807807
// Before we inject any dependencies, make sure we don't inject a
808808
// circular dependency by validating that this crate doesn't
809809
// transitively depend on any crates satisfying `needs_dep`.
810-
for dep in self.cstore.crate_dependencies_in_rpo(krate) {
810+
for dep in self.cstore.crate_dependencies_in_reverse_postorder(krate) {
811811
let data = self.cstore.get_crate_data(dep);
812812
if needs_dep(&data) {
813813
self.sess.err(&format!("the crate `{}` cannot depend \

src/librustc_metadata/cstore.rs

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::rmeta::CrateMetadata;
55

66
use rustc_data_structures::sync::Lrc;
77
use rustc_index::vec::IndexVec;
8-
use rustc::hir::def_id::CrateNum;
8+
use rustc::hir::def_id::{LOCAL_CRATE, CrateNum};
99
use syntax::ast;
1010
use syntax::edition::Edition;
1111
use syntax::expand::allocator::AllocatorKind;
@@ -55,45 +55,40 @@ impl CStore {
5555
self.metas[cnum] = Some(Lrc::new(data));
5656
}
5757

58-
crate fn iter_crate_data<I>(&self, mut i: I)
59-
where I: FnMut(CrateNum, &CrateMetadata)
60-
{
61-
for (k, v) in self.metas.iter_enumerated() {
62-
if let &Some(ref v) = v {
63-
i(k, v);
58+
crate fn iter_crate_data(&self, mut f: impl FnMut(CrateNum, &CrateMetadata)) {
59+
for (cnum, data) in self.metas.iter_enumerated() {
60+
if let Some(data) = data {
61+
f(cnum, data);
6462
}
6563
}
6664
}
6765

68-
crate fn crate_dependencies_in_rpo(&self, krate: CrateNum) -> Vec<CrateNum> {
69-
let mut ordering = Vec::new();
70-
self.push_dependencies_in_postorder(&mut ordering, krate);
71-
ordering.reverse();
72-
ordering
73-
}
66+
fn push_dependencies_in_postorder(&self, deps: &mut Vec<CrateNum>, cnum: CrateNum) {
67+
if !deps.contains(&cnum) {
68+
let data = self.get_crate_data(cnum);
69+
for &dep in data.dependencies.borrow().iter() {
70+
if dep != cnum {
71+
self.push_dependencies_in_postorder(deps, dep);
72+
}
73+
}
7474

75-
crate fn push_dependencies_in_postorder(&self, ordering: &mut Vec<CrateNum>, krate: CrateNum) {
76-
if ordering.contains(&krate) {
77-
return;
75+
deps.push(cnum);
7876
}
77+
}
7978

80-
let data = self.get_crate_data(krate);
81-
for &dep in data.dependencies.borrow().iter() {
82-
if dep != krate {
83-
self.push_dependencies_in_postorder(ordering, dep);
84-
}
79+
crate fn crate_dependencies_in_postorder(&self, cnum: CrateNum) -> Vec<CrateNum> {
80+
let mut deps = Vec::new();
81+
if cnum == LOCAL_CRATE {
82+
self.iter_crate_data(|cnum, _| self.push_dependencies_in_postorder(&mut deps, cnum));
83+
} else {
84+
self.push_dependencies_in_postorder(&mut deps, cnum);
8585
}
86-
87-
ordering.push(krate);
86+
deps
8887
}
8988

90-
crate fn do_postorder_cnums_untracked(&self) -> Vec<CrateNum> {
91-
let mut ordering = Vec::new();
92-
for (num, v) in self.metas.iter_enumerated() {
93-
if let &Some(_) = v {
94-
self.push_dependencies_in_postorder(&mut ordering, num);
95-
}
96-
}
97-
return ordering
89+
crate fn crate_dependencies_in_reverse_postorder(&self, cnum: CrateNum) -> Vec<CrateNum> {
90+
let mut deps = self.crate_dependencies_in_postorder(cnum);
91+
deps.reverse();
92+
deps
9893
}
9994
}

src/librustc_metadata/rmeta/decoder/cstore_impl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ impl CrateStore for cstore::CStore {
517517
}
518518

519519
fn postorder_cnums_untracked(&self) -> Vec<CrateNum> {
520-
self.do_postorder_cnums_untracked()
520+
self.crate_dependencies_in_postorder(LOCAL_CRATE)
521521
}
522522

523523
fn encode_metadata(&self, tcx: TyCtxt<'_>) -> EncodedMetadata {

0 commit comments

Comments
 (0)