diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 7148b83ccf85..957e94ac6f88 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -321,7 +321,7 @@ struct ctxt_ { // Maps from def-id of a type or region parameter to its // (inferred) variance. - item_variance_map: @mut HashMap, + item_variance_map: RefCell>, // A mapping from the def ID of an enum or struct type to the def ID // of the method that implements its destructor. If the type is not @@ -975,7 +975,7 @@ pub fn mk_ctxt(s: session::Session, -> ctxt { @ctxt_ { named_region_map: named_region_map, - item_variance_map: @mut HashMap::new(), + item_variance_map: RefCell::new(HashMap::new()), diag: s.diagnostic(), interner: RefCell::new(HashMap::new()), next_id: @mut primitives::LAST_PRIMITIVE_ID, @@ -4483,8 +4483,9 @@ pub fn visitor_object_ty(tcx: ctxt, } pub fn item_variances(tcx: ctxt, item_id: ast::DefId) -> @ItemVariances { + let mut item_variance_map = tcx.item_variance_map.borrow_mut(); lookup_locally_or_in_crate_store( - "item_variance_map", item_id, tcx.item_variance_map, + "item_variance_map", item_id, item_variance_map.get(), || @csearch::get_item_variances(tcx.cstore, item_id)) } diff --git a/src/librustc/middle/typeck/variance.rs b/src/librustc/middle/typeck/variance.rs index 219f9689a257..3ae43d606617 100644 --- a/src/librustc/middle/typeck/variance.rs +++ b/src/librustc/middle/typeck/variance.rs @@ -363,7 +363,10 @@ impl<'a> Visitor<()> for TermsContext<'a> { // "invalid item id" from "item id with no // parameters". if self.num_inferred() == inferreds_on_entry { - let newly_added = self.tcx.item_variance_map.insert( + let mut item_variance_map = self.tcx + .item_variance_map + .borrow_mut(); + let newly_added = item_variance_map.get().insert( ast_util::local_def(item.id), self.empty_variances); assert!(newly_added); @@ -876,7 +879,6 @@ impl<'a> SolveContext<'a> { // item id). let tcx = self.terms_cx.tcx; - let item_variance_map = tcx.item_variance_map; let solutions = &self.solutions; let inferred_infos = &self.terms_cx.inferred_infos; let mut index = 0; @@ -919,8 +921,9 @@ impl<'a> SolveContext<'a> { tcx.sess.span_err(ast_map::node_span(tcx.items, item_id), found); } - let newly_added = item_variance_map.insert(item_def_id, - @item_variances); + let mut item_variance_map = tcx.item_variance_map.borrow_mut(); + let newly_added = item_variance_map.get().insert(item_def_id, + @item_variances); assert!(newly_added); } }