diff --git a/src/librustc/middle/kind.rs b/src/librustc/middle/kind.rs index ba5d1dcd7fd..5886eedc48b 100644 --- a/src/librustc/middle/kind.rs +++ b/src/librustc/middle/kind.rs @@ -119,8 +119,13 @@ fn check_impl_of_trait(cx: &mut Context, it: @item, trait_ref: &trait_ref, self_ let ast_trait_def = cx.tcx.def_map.find(&trait_ref.ref_id) .expect("trait ref not in def map!"); let trait_def_id = ast_util::def_id_of_def(*ast_trait_def); - let trait_def = cx.tcx.trait_defs.find(&trait_def_id) - .expect("trait def not in trait-defs map!"); + let trait_def; + { + let trait_defs = cx.tcx.trait_defs.borrow(); + trait_def = *trait_defs.get() + .find(&trait_def_id) + .expect("trait def not in trait-defs map!"); + } // If this trait has builtin-kind supertraits, meet them. let self_ty: ty::t = ty::node_id_to_type(cx.tcx, it.id); diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index c0a66ee81fd..5633be1d83c 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -298,7 +298,7 @@ struct ctxt_ { impl_trait_cache: RefCell>>, trait_refs: RefCell>, - trait_defs: @mut HashMap, + trait_defs: RefCell>, /// Despite its name, `items` does not only map NodeId to an item but /// also to expr/stmt/local/arg/etc @@ -987,7 +987,7 @@ pub fn mk_ctxt(s: session::Session, node_types: @mut HashMap::new(), node_type_substs: RefCell::new(HashMap::new()), trait_refs: RefCell::new(HashMap::new()), - trait_defs: @mut HashMap::new(), + trait_defs: RefCell::new(HashMap::new()), items: amap, intrinsic_defs: @mut HashMap::new(), freevars: freevars, @@ -3963,7 +3963,8 @@ pub fn lookup_impl_vtables(cx: ctxt, /// Given the did of a trait, returns its canonical trait ref. pub fn lookup_trait_def(cx: ctxt, did: ast::DefId) -> @ty::TraitDef { - match cx.trait_defs.find(&did) { + let mut trait_defs = cx.trait_defs.borrow_mut(); + match trait_defs.get().find(&did) { Some(&trait_def) => { // The item is in this crate. The caller should have added it to the // type cache already @@ -3972,7 +3973,7 @@ pub fn lookup_trait_def(cx: ctxt, did: ast::DefId) -> @ty::TraitDef { None => { assert!(did.crate != ast::LOCAL_CRATE); let trait_def = @csearch::get_trait_def(cx, did); - cx.trait_defs.insert(did, trait_def); + trait_defs.get().insert(did, trait_def); return trait_def; } } diff --git a/src/librustc/middle/typeck/collect.rs b/src/librustc/middle/typeck/collect.rs index 2391742ea9a..8e37745e621 100644 --- a/src/librustc/middle/typeck/collect.rs +++ b/src/librustc/middle/typeck/collect.rs @@ -740,10 +740,14 @@ fn get_trait_def(ccx: &CrateCtxt, trait_id: ast::DefId) -> @ty::TraitDef { pub fn trait_def_of_item(ccx: &CrateCtxt, it: &ast::item) -> @ty::TraitDef { let def_id = local_def(it.id); let tcx = ccx.tcx; - match tcx.trait_defs.find(&def_id) { - Some(&def) => return def, - _ => {} + { + let trait_defs = tcx.trait_defs.borrow(); + match trait_defs.get().find(&def_id) { + Some(&def) => return def, + _ => {} + } } + match it.node { ast::item_trait(ref generics, ref supertraits, _) => { let self_ty = ty::mk_self(tcx, def_id); @@ -755,7 +759,8 @@ pub fn trait_def_of_item(ccx: &CrateCtxt, it: &ast::item) -> @ty::TraitDef { let trait_def = @ty::TraitDef {generics: ty_generics, bounds: bounds, trait_ref: trait_ref}; - tcx.trait_defs.insert(def_id, trait_def); + let mut trait_defs = tcx.trait_defs.borrow_mut(); + trait_defs.get().insert(def_id, trait_def); return trait_def; } ref s => {