Skip to content

Commit fdd7e3c

Browse files
committed
remove some of the ways to mutate a DepTrackingMap
It is pretty suspect to insert an entry twice.
1 parent d9aaca7 commit fdd7e3c

File tree

6 files changed

+29
-45
lines changed

6 files changed

+29
-45
lines changed

src/librustc/dep_graph/dep_tracking_map.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,10 @@ impl<M: DepTrackingMapConfig> DepTrackingMap<M> {
6161
self.map.get(k)
6262
}
6363

64-
pub fn get_mut(&mut self, k: &M::Key) -> Option<&mut M::Value> {
65-
self.read(k);
66-
self.write(k);
67-
self.map.get_mut(k)
68-
}
69-
70-
pub fn insert(&mut self, k: M::Key, v: M::Value) -> Option<M::Value> {
64+
pub fn insert(&mut self, k: M::Key, v: M::Value) {
7165
self.write(&k);
72-
self.map.insert(k, v)
66+
let _old_value = self.map.insert(k, v);
67+
// assert!(old_value.is_none());
7368
}
7469

7570
pub fn contains_key(&self, k: &M::Key) -> bool {
@@ -80,17 +75,6 @@ impl<M: DepTrackingMapConfig> DepTrackingMap<M> {
8075
pub fn keys(&self) -> Vec<M::Key> {
8176
self.map.keys().cloned().collect()
8277
}
83-
84-
/// Append `elem` to the vector stored for `k`, creating a new vector if needed.
85-
/// This is considered a write to `k`.
86-
pub fn push<E: Clone>(&mut self, k: M::Key, elem: E)
87-
where M: DepTrackingMapConfig<Value=Vec<E>>
88-
{
89-
self.write(&k);
90-
self.map.entry(k)
91-
.or_insert(Vec::new())
92-
.push(elem);
93-
}
9478
}
9579

9680
impl<M: DepTrackingMapConfig> MemoizationMap for RefCell<DepTrackingMap<M>> {

src/librustc_mir/mir_map.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BuildMir<'a, 'tcx> {
139139

140140
let mir = tcx.alloc_mir(mir);
141141
let def_id = tcx.hir.local_def_id(src.item_id());
142-
assert!(tcx.mir_map.borrow_mut().insert(def_id, mir).is_none());
142+
tcx.mir_map.borrow_mut().insert(def_id, mir);
143143
});
144144

145145
let body = self.tcx.hir.body(body_id);

src/librustc_typeck/coherence/mod.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,19 @@ use rustc::dep_graph::DepNode;
2929
use rustc::hir::itemlikevisit::ItemLikeVisitor;
3030
use rustc::hir::{Item, ItemImpl};
3131
use rustc::hir;
32+
use rustc::util::nodemap::DefIdMap;
3233

3334
mod builtin;
3435
mod orphan;
3536
mod overlap;
3637
mod unsafety;
3738

38-
struct CoherenceChecker<'a, 'tcx: 'a> {
39+
struct CoherenceCollect<'a, 'tcx: 'a> {
3940
tcx: TyCtxt<'a, 'tcx, 'tcx>,
41+
inherent_impls: DefIdMap<Vec<DefId>>,
4042
}
4143

42-
impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for CoherenceChecker<'a, 'tcx> {
44+
impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for CoherenceCollect<'a, 'tcx> {
4345
fn visit_item(&mut self, item: &Item) {
4446
if let ItemImpl(..) = item.node {
4547
self.check_implementation(item)
@@ -53,7 +55,7 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for CoherenceChecker<'a, 'tcx> {
5355
}
5456
}
5557

56-
impl<'a, 'tcx> CoherenceChecker<'a, 'tcx> {
58+
impl<'a, 'tcx> CoherenceCollect<'a, 'tcx> {
5759
// Returns the def ID of the base type, if there is one.
5860
fn get_base_type_def_id(&self, span: Span, ty: Ty<'tcx>) -> Option<DefId> {
5961
match ty.sty {
@@ -80,9 +82,14 @@ impl<'a, 'tcx> CoherenceChecker<'a, 'tcx> {
8082
// containing the inherent methods and extension methods. It also
8183
// builds up the trait inheritance table.
8284
self.tcx.visit_all_item_likes_in_krate(DepNode::CoherenceCheckImpl, self);
85+
86+
// Transfer the inherent impl lists, not that they are known, into the tcx
87+
for (ty_def_id, impl_def_ids) in self.inherent_impls.drain() {
88+
self.tcx.inherent_impls.borrow_mut().insert(ty_def_id, impl_def_ids);
89+
}
8390
}
8491

85-
fn check_implementation(&self, item: &Item) {
92+
fn check_implementation(&mut self, item: &Item) {
8693
let tcx = self.tcx;
8794
let impl_did = tcx.hir.local_def_id(item.id);
8895
let self_type = tcx.item_type(impl_did);
@@ -119,8 +126,10 @@ impl<'a, 'tcx> CoherenceChecker<'a, 'tcx> {
119126
}
120127
}
121128

122-
fn add_inherent_impl(&self, base_def_id: DefId, impl_def_id: DefId) {
123-
self.tcx.inherent_impls.borrow_mut().push(base_def_id, impl_def_id);
129+
fn add_inherent_impl(&mut self, base_def_id: DefId, impl_def_id: DefId) {
130+
self.inherent_impls.entry(base_def_id)
131+
.or_insert(vec![])
132+
.push(impl_def_id);
124133
}
125134

126135
fn add_trait_impl(&self, impl_trait_ref: ty::TraitRef<'tcx>, impl_def_id: DefId) {
@@ -161,7 +170,7 @@ fn enforce_trait_manually_implementable(tcx: TyCtxt, sp: Span, trait_def_id: Def
161170

162171
pub fn check_coherence(ccx: &CrateCtxt) {
163172
let _task = ccx.tcx.dep_graph.in_task(DepNode::Coherence);
164-
CoherenceChecker { tcx: ccx.tcx }.check();
173+
CoherenceCollect { tcx: ccx.tcx, inherent_impls: DefIdMap() }.check();
165174
unsafety::check(ccx.tcx);
166175
orphan::check(ccx.tcx);
167176
overlap::check(ccx.tcx);

src/librustc_typeck/collect.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ fn convert_field<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
634634
ccx.tcx.item_types.borrow_mut().insert(ty_f.did, tt);
635635

636636
let def_id = ccx.tcx.hir.local_def_id(field.id);
637-
ccx.tcx.item_types.borrow_mut().insert(def_id, tt);
637+
assert_eq!(def_id, ty_f.did);
638638
ccx.tcx.generics.borrow_mut().insert(def_id, struct_generics);
639639
ccx.tcx.predicates.borrow_mut().insert(def_id, struct_predicates.clone());
640640
}
@@ -1283,9 +1283,7 @@ fn convert_trait_predicates<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, it: &hir::Item)
12831283
items);
12841284
trait_predicates.predicates.extend(assoc_predicates);
12851285

1286-
let prev_predicates = tcx.predicates.borrow_mut().insert(def_id, trait_predicates);
1287-
assert!(prev_predicates.is_none());
1288-
1286+
tcx.predicates.borrow_mut().insert(def_id, trait_predicates);
12891287
return;
12901288

12911289
fn predicates_for_associated_types<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
@@ -1592,9 +1590,7 @@ fn predicates_of_item<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
15921590
};
15931591

15941592
let predicates = ty_generic_predicates(ccx, generics, None, vec![], false);
1595-
let prev_predicates = ccx.tcx.predicates.borrow_mut().insert(def_id,
1596-
predicates.clone());
1597-
assert!(prev_predicates.is_none());
1593+
ccx.tcx.predicates.borrow_mut().insert(def_id, predicates.clone());
15981594

15991595
predicates
16001596
}
@@ -1617,8 +1613,7 @@ fn convert_foreign_item<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
16171613
};
16181614

16191615
let predicates = ty_generic_predicates(ccx, generics, None, vec![], false);
1620-
let prev_predicates = ccx.tcx.predicates.borrow_mut().insert(def_id, predicates);
1621-
assert!(prev_predicates.is_none());
1616+
ccx.tcx.predicates.borrow_mut().insert(def_id, predicates);
16221617
}
16231618

16241619
// Is it marked with ?Sized

src/librustc_typeck/variance/solve.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,9 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
137137
item_variances);
138138
}
139139

140-
let newly_added = tcx.item_variance_map
141-
.borrow_mut()
142-
.insert(item_def_id, Rc::new(item_variances))
143-
.is_none();
144-
assert!(newly_added);
140+
tcx.item_variance_map
141+
.borrow_mut()
142+
.insert(item_def_id, Rc::new(item_variances));
145143
}
146144
}
147145

src/librustc_typeck/variance/terms.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,10 @@ impl<'a, 'tcx> TermsContext<'a, 'tcx> {
178178
// parameters".
179179
if self.num_inferred() == inferreds_on_entry {
180180
let item_def_id = self.tcx.hir.local_def_id(item_id);
181-
let newly_added = self.tcx
181+
self.tcx
182182
.item_variance_map
183183
.borrow_mut()
184-
.insert(item_def_id, self.empty_variances.clone())
185-
.is_none();
186-
assert!(newly_added);
184+
.insert(item_def_id, self.empty_variances.clone());
187185
}
188186
}
189187

0 commit comments

Comments
 (0)