From 72f9cbe8ac36196bfb55b78e35fd92a0749d4740 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 19 Dec 2013 19:54:52 -0800 Subject: [PATCH] librustc: De-`@mut` the borrow check's root map --- src/librustc/middle/borrowck/gather_loans/lifetime.rs | 4 +++- src/librustc/middle/borrowck/mod.rs | 5 +++-- src/librustc/middle/const_eval.rs | 5 +++-- src/librustc/middle/trans/_match.rs | 3 ++- src/librustc/middle/trans/write_guard.rs | 9 ++++++--- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/librustc/middle/borrowck/gather_loans/lifetime.rs b/src/librustc/middle/borrowck/gather_loans/lifetime.rs index 8c6384c02967..a4911ca556fd 100644 --- a/src/librustc/middle/borrowck/gather_loans/lifetime.rs +++ b/src/librustc/middle/borrowck/gather_loans/lifetime.rs @@ -279,7 +279,9 @@ impl<'a> GuaranteeLifetimeContext<'a> { // Add a record of what is required let rm_key = root_map_key {id: cmt_deref.id, derefs: derefs}; let root_info = RootInfo {scope: root_scope, freeze: opt_dyna}; - self.bccx.root_map.insert(rm_key, root_info); + + let mut root_map = self.bccx.root_map.borrow_mut(); + root_map.get().insert(rm_key, root_info); debug!("root_key: {:?} root_info: {:?}", rm_key, root_info); Ok(()) diff --git a/src/librustc/middle/borrowck/mod.rs b/src/librustc/middle/borrowck/mod.rs index bbe2efa3c556..a445fd422710 100644 --- a/src/librustc/middle/borrowck/mod.rs +++ b/src/librustc/middle/borrowck/mod.rs @@ -20,6 +20,7 @@ use middle::dataflow::DataFlowOperator; use util::common::stmt_set; use util::ppaux::{note_and_explain_region, Repr, UserString}; +use std::cell::RefCell; use std::hashmap::{HashSet, HashMap}; use std::ops::{BitOr, BitAnd}; use std::result::{Result}; @@ -413,10 +414,10 @@ pub struct RootInfo { freeze: Option // Some() if we should freeze box at runtime } -pub type root_map = @mut HashMap; +pub type root_map = @RefCell>; pub fn root_map() -> root_map { - return @mut HashMap::new(); + return @RefCell::new(HashMap::new()); } pub enum DynaFreezeKind { diff --git a/src/librustc/middle/const_eval.rs b/src/librustc/middle/const_eval.rs index d0eafa1e7b75..a9a1dc528ee3 100644 --- a/src/librustc/middle/const_eval.rs +++ b/src/librustc/middle/const_eval.rs @@ -19,6 +19,7 @@ use syntax::visit; use syntax::visit::Visitor; use syntax::ast::*; +use std::cell::RefCell; use std::hashmap::{HashMap, HashSet}; // @@ -119,7 +120,7 @@ pub fn lookup_variant_by_id(tcx: ty::ctxt, } } let maps = astencode::Maps { - root_map: @mut HashMap::new(), + root_map: @RefCell::new(HashMap::new()), method_map: @mut HashMap::new(), vtable_map: @mut HashMap::new(), write_guard_map: @mut HashSet::new(), @@ -169,7 +170,7 @@ pub fn lookup_const_by_id(tcx: ty::ctxt, } } let maps = astencode::Maps { - root_map: @mut HashMap::new(), + root_map: @RefCell::new(HashMap::new()), method_map: @mut HashMap::new(), vtable_map: @mut HashMap::new(), write_guard_map: @mut HashSet::new(), diff --git a/src/librustc/middle/trans/_match.rs b/src/librustc/middle/trans/_match.rs index 6852f5ca862b..9f2b6833374e 100644 --- a/src/librustc/middle/trans/_match.rs +++ b/src/librustc/middle/trans/_match.rs @@ -1112,7 +1112,8 @@ fn pats_require_rooting(bcx: @Block, m.iter().any(|br| { let pat_id = br.pats[col].id; let key = root_map_key {id: pat_id, derefs: 0u }; - bcx.ccx().maps.root_map.contains_key(&key) + let root_map = bcx.ccx().maps.root_map.borrow(); + root_map.get().contains_key(&key) }) } diff --git a/src/librustc/middle/trans/write_guard.rs b/src/librustc/middle/trans/write_guard.rs index 5c88985ce6f8..922abffac9ea 100644 --- a/src/librustc/middle/trans/write_guard.rs +++ b/src/librustc/middle/trans/write_guard.rs @@ -45,9 +45,12 @@ pub fn root_and_write_guard(datum: &Datum, // // (Note: root'd values are always boxes) let ccx = bcx.ccx(); - bcx = match ccx.maps.root_map.find(&key) { - None => bcx, - Some(&root_info) => root(datum, bcx, span, key, root_info) + bcx = { + let root_map = ccx.maps.root_map.borrow(); + match root_map.get().find(&key) { + None => bcx, + Some(&root_info) => root(datum, bcx, span, key, root_info) + } }; // Perform the write guard, if necessary.