diff options
| author | Mark Mansi <markm@cs.wisc.edu> | 2020-03-12 19:14:13 -0500 |
|---|---|---|
| committer | Mark Mansi <markm@cs.wisc.edu> | 2020-03-12 19:17:08 -0500 |
| commit | 4b46271841d75ee8b45b7b4db2ce531a764785fa (patch) | |
| tree | ba655ce20db1175117fe8e8cbbea3c4b4c79d14a | |
| parent | 54b7d21f59a363e53eb1c31d76b40af2ff99321c (diff) | |
| download | rust-4b46271841d75ee8b45b7b4db2ce531a764785fa.tar.gz rust-4b46271841d75ee8b45b7b4db2ce531a764785fa.zip | |
Remove a couple of Rc's from RegionInferenceContext
| -rw-r--r-- | src/librustc_mir/borrow_check/mod.rs | 28 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/region_infer/mod.rs | 9 |
2 files changed, 28 insertions, 9 deletions
diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index a61d00b0120..8dc6ee7ea3b 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -73,6 +73,24 @@ crate use place_ext::PlaceExt; crate use places_conflict::{places_conflict, PlaceConflictBias}; crate use region_infer::RegionInferenceContext; +/// An owned immutable value. +#[derive(Debug)] +struct Frozen<T>(T); + +impl<T> Frozen<T> { + pub fn freeze(val: T) -> Self { + Frozen(val) + } +} + +impl<T> std::ops::Deref for Frozen<T> { + type Target = T; + + fn deref(&self) -> &T { + &self.0 + } +} + // FIXME(eddyb) perhaps move this somewhere more centrally. #[derive(Debug)] crate struct Upvar { @@ -1577,11 +1595,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { mpi, ); } // Only query longest prefix with a MovePath, not further - // ancestors; dataflow recurs on children when parents - // move (to support partial (re)inits). - // - // (I.e., querying parents breaks scenario 7; but may want - // to do such a query based on partial-init feature-gate.) + // ancestors; dataflow recurs on children when parents + // move (to support partial (re)inits). + // + // (I.e., querying parents breaks scenario 7; but may want + // to do such a query based on partial-init feature-gate.) } /// Subslices correspond to multiple move paths, so we iterate through the diff --git a/src/librustc_mir/borrow_check/region_infer/mod.rs b/src/librustc_mir/borrow_check/region_infer/mod.rs index 144f655420b..43744d78219 100644 --- a/src/librustc_mir/borrow_check/region_infer/mod.rs +++ b/src/librustc_mir/borrow_check/region_infer/mod.rs @@ -31,6 +31,7 @@ use crate::borrow_check::{ }, type_check::{free_region_relations::UniversalRegionRelations, Locations}, universal_regions::UniversalRegions, + Frozen, }; mod dump_mir; @@ -54,12 +55,12 @@ pub struct RegionInferenceContext<'tcx> { liveness_constraints: LivenessValues<RegionVid>, /// The outlives constraints computed by the type-check. - constraints: Rc<OutlivesConstraintSet>, + constraints: Frozen<OutlivesConstraintSet>, /// The constraint-set, but in graph form, making it easy to traverse /// the constraints adjacent to a particular region. Used to construct /// the SCC (see `constraint_sccs`) and for error reporting. - constraint_graph: Rc<NormalConstraintGraph>, + constraint_graph: Frozen<NormalConstraintGraph>, /// The SCC computed from `constraints` and the constraint /// graph. We have an edge from SCC A to SCC B if `A: B`. Used to @@ -263,8 +264,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { .map(|info| RegionDefinition::new(info.universe, info.origin)) .collect(); - let constraints = Rc::new(outlives_constraints); // freeze constraints - let constraint_graph = Rc::new(constraints.graph(definitions.len())); + let constraints = Frozen::freeze(outlives_constraints); + let constraint_graph = Frozen::freeze(constraints.graph(definitions.len())); let fr_static = universal_regions.fr_static; let constraint_sccs = Rc::new(constraints.compute_sccs(&constraint_graph, fr_static)); |
