From 3840d505168652cd4115b24613077ee9d571ff44 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 19 Dec 2013 20:35:14 -0800 Subject: [PATCH] librustc: De-`@mut` the variable bindings in the inference context --- src/librustc/middle/typeck/infer/mod.rs | 57 +++++++++++++---------- src/librustc/middle/typeck/infer/unify.rs | 21 +++++---- 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/src/librustc/middle/typeck/infer/mod.rs b/src/librustc/middle/typeck/infer/mod.rs index 20aa57aadff0..bb3289930ff8 100644 --- a/src/librustc/middle/typeck/infer/mod.rs +++ b/src/librustc/middle/typeck/infer/mod.rs @@ -35,7 +35,7 @@ use middle::typeck::infer::lub::Lub; use middle::typeck::infer::to_str::InferStr; use middle::typeck::infer::unify::{ValsAndBindings, Root}; use middle::typeck::infer::error_reporting::ErrorReporting; -use std::cell::Cell; +use std::cell::{Cell, RefCell}; use std::hashmap::HashMap; use std::result; use std::vec; @@ -80,15 +80,17 @@ pub struct InferCtxt { // We instantiate ValsAndBindings with bounds because the // types that might instantiate a general type variable have an // order, represented by its upper and lower bounds. - ty_var_bindings: ValsAndBindings>, + ty_var_bindings: RefCell>>, ty_var_counter: Cell, // Map from integral variable to the kind of integer it represents - int_var_bindings: ValsAndBindings>, + int_var_bindings: RefCell>>, int_var_counter: Cell, // Map from floating variable to the kind of float it represents - float_var_bindings: ValsAndBindings>, + float_var_bindings: RefCell>>, float_var_counter: Cell, // For region variables. @@ -260,13 +262,13 @@ pub fn new_infer_ctxt(tcx: ty::ctxt) -> @mut InferCtxt { @mut InferCtxt { tcx: tcx, - ty_var_bindings: new_ValsAndBindings(), + ty_var_bindings: RefCell::new(new_ValsAndBindings()), ty_var_counter: Cell::new(0), - int_var_bindings: new_ValsAndBindings(), + int_var_bindings: RefCell::new(new_ValsAndBindings()), int_var_counter: Cell::new(0), - float_var_bindings: new_ValsAndBindings(), + float_var_bindings: RefCell::new(new_ValsAndBindings()), float_var_counter: Cell::new(0), region_vars: RegionVarBindings(tcx), @@ -522,25 +524,25 @@ impl InferCtxt { } pub fn start_snapshot(&mut self) -> Snapshot { + let ty_var_bindings = self.ty_var_bindings.borrow(); + let int_var_bindings = self.int_var_bindings.borrow(); + let float_var_bindings = self.float_var_bindings.borrow(); Snapshot { - ty_var_bindings_len: - self.ty_var_bindings.bindings.len(), - int_var_bindings_len: - self.int_var_bindings.bindings.len(), - float_var_bindings_len: - self.float_var_bindings.bindings.len(), - region_vars_snapshot: - self.region_vars.start_snapshot(), + ty_var_bindings_len: ty_var_bindings.get().bindings.len(), + int_var_bindings_len: int_var_bindings.get().bindings.len(), + float_var_bindings_len: float_var_bindings.get().bindings.len(), + region_vars_snapshot: self.region_vars.start_snapshot(), } } pub fn rollback_to(&mut self, snapshot: &Snapshot) { debug!("rollback!"); - rollback_to(&mut self.ty_var_bindings, snapshot.ty_var_bindings_len); - - rollback_to(&mut self.int_var_bindings, - snapshot.int_var_bindings_len); - rollback_to(&mut self.float_var_bindings, + let mut ty_var_bindings = self.ty_var_bindings.borrow_mut(); + let mut int_var_bindings = self.int_var_bindings.borrow_mut(); + let mut float_var_bindings = self.float_var_bindings.borrow_mut(); + rollback_to(ty_var_bindings.get(), snapshot.ty_var_bindings_len); + rollback_to(int_var_bindings.get(), snapshot.int_var_bindings_len); + rollback_to(float_var_bindings.get(), snapshot.float_var_bindings_len); self.region_vars.rollback_to(snapshot.region_vars_snapshot); @@ -554,8 +556,10 @@ impl InferCtxt { indent(|| { let r = self.try(|| f()); - self.ty_var_bindings.bindings.truncate(0); - self.int_var_bindings.bindings.truncate(0); + let mut ty_var_bindings = self.ty_var_bindings.borrow_mut(); + let mut int_var_bindings = self.int_var_bindings.borrow_mut(); + ty_var_bindings.get().bindings.truncate(0); + int_var_bindings.get().bindings.truncate(0); self.region_vars.commit(); r }) @@ -603,7 +607,8 @@ impl InferCtxt { let id = self.ty_var_counter.get(); self.ty_var_counter.set(id + 1); { - let vals = &mut self.ty_var_bindings.vals; + let mut ty_var_bindings = self.ty_var_bindings.borrow_mut(); + let vals = &mut ty_var_bindings.get().vals; vals.insert(id, Root(Bounds { lb: None, ub: None }, 0u)); } return TyVid(id); @@ -619,8 +624,9 @@ impl InferCtxt { pub fn next_int_var_id(&mut self) -> IntVid { let mut int_var_counter = self.int_var_counter.get(); + let mut int_var_bindings = self.int_var_bindings.borrow_mut(); let result = IntVid(next_simple_var(&mut int_var_counter, - &mut self.int_var_bindings)); + int_var_bindings.get())); self.int_var_counter.set(int_var_counter); result } @@ -631,8 +637,9 @@ impl InferCtxt { pub fn next_float_var_id(&mut self) -> FloatVid { let mut float_var_counter = self.float_var_counter.get(); + let mut float_var_bindings = self.float_var_bindings.borrow_mut(); let result = FloatVid(next_simple_var(&mut float_var_counter, - &mut self.float_var_bindings)); + float_var_bindings.get())); self.float_var_counter.set(float_var_counter); result } diff --git a/src/librustc/middle/typeck/infer/unify.rs b/src/librustc/middle/typeck/infer/unify.rs index b58a526b7ea9..2294fb524425 100644 --- a/src/librustc/middle/typeck/infer/unify.rs +++ b/src/librustc/middle/typeck/infer/unify.rs @@ -16,6 +16,7 @@ use middle::ty; use middle::typeck::infer::{Bounds, uok, ures}; use middle::typeck::infer::InferCtxt; use middle::typeck::infer::to_str::InferStr; +use std::cell::RefCell; use syntax::ast; #[deriving(Clone)] @@ -37,7 +38,8 @@ pub struct Node { pub trait UnifyVid { fn appropriate_vals_and_bindings<'v>(infcx: &'v mut InferCtxt) - -> &'v mut ValsAndBindings; + -> &'v mut RefCell>; } pub trait UnifyInferCtxtMethods { @@ -74,7 +76,8 @@ impl UnifyInferCtxtMethods for InferCtxt { let tcx = self.tcx; let vb = UnifyVid::appropriate_vals_and_bindings(self); - return helper(tcx, vb, vid); + let mut vb = vb.borrow_mut(); + return helper(tcx, vb.get(), vid); fn helper( tcx: ty::ctxt, @@ -120,9 +123,10 @@ impl UnifyInferCtxtMethods for InferCtxt { vid.to_str(), new_v.inf_str(self)); let vb = UnifyVid::appropriate_vals_and_bindings(self); - let old_v = (*vb.vals.get(&vid.to_uint())).clone(); - vb.bindings.push((vid.clone(), old_v)); - vb.vals.insert(vid.to_uint(), new_v); + let mut vb = vb.borrow_mut(); + let old_v = (*vb.get().vals.get(&vid.to_uint())).clone(); + vb.get().bindings.push((vid.clone(), old_v)); + vb.get().vals.insert(vid.to_uint(), new_v); } fn unify> for ty::TyVid { fn appropriate_vals_and_bindings<'v>(infcx: &'v mut InferCtxt) - -> &'v mut ValsAndBindings> { + -> &'v mut RefCell>> { return &mut infcx.ty_var_bindings; } } impl UnifyVid> for ty::IntVid { fn appropriate_vals_and_bindings<'v>(infcx: &'v mut InferCtxt) - -> &'v mut ValsAndBindings> { + -> &'v mut RefCell>> { return &mut infcx.int_var_bindings; } } @@ -295,7 +299,8 @@ impl SimplyUnifiable for IntVarValue { impl UnifyVid> for ty::FloatVid { fn appropriate_vals_and_bindings<'v>(infcx: &'v mut InferCtxt) - -> &'v mut ValsAndBindings> { + -> &'v mut RefCell>> { return &mut infcx.float_var_bindings; } }