diff options
| author | Taylor Cramer <cramertaylorj@gmail.com> | 2017-03-27 23:54:41 -0700 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2017-04-30 17:02:56 -0400 |
| commit | eff39b73d1c50edf58a6b30ad02285ba64528cfe (patch) | |
| tree | 198baab81320ef586cfd7ecce94b066ab221b077 /src/librustc/middle | |
| parent | 06fb4d25642a3f223db1441972dd5962085cfba1 (diff) | |
| download | rust-eff39b73d1c50edf58a6b30ad02285ba64528cfe.tar.gz rust-eff39b73d1c50edf58a6b30ad02285ba64528cfe.zip | |
On-demandify region mapping
Diffstat (limited to 'src/librustc/middle')
| -rw-r--r-- | src/librustc/middle/free_region.rs | 4 | ||||
| -rw-r--r-- | src/librustc/middle/liveness.rs | 2 | ||||
| -rw-r--r-- | src/librustc/middle/mem_categorization.rs | 4 | ||||
| -rw-r--r-- | src/librustc/middle/region.rs | 41 |
4 files changed, 38 insertions, 13 deletions
diff --git a/src/librustc/middle/free_region.rs b/src/librustc/middle/free_region.rs index 2bfa8dec0bf..f622dfc683b 100644 --- a/src/librustc/middle/free_region.rs +++ b/src/librustc/middle/free_region.rs @@ -136,10 +136,10 @@ impl FreeRegionMap { true, (&ty::ReScope(sub_scope), &ty::ReScope(super_scope)) => - tcx.region_maps.is_subscope_of(sub_scope, super_scope), + tcx.region_maps().is_subscope_of(sub_scope, super_scope), (&ty::ReScope(sub_scope), &ty::ReFree(fr)) => - tcx.region_maps.is_subscope_of(sub_scope, fr.scope) || + tcx.region_maps().is_subscope_of(sub_scope, fr.scope) || self.is_static(fr), (&ty::ReFree(sub_fr), &ty::ReFree(super_fr)) => diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index 63104678862..73c8d1db312 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -1441,7 +1441,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { // and must outlive the *call-site* of the function. let fn_ret = self.ir.tcx.liberate_late_bound_regions( - self.ir.tcx.region_maps.call_site_extent(id, body.value.id), + self.ir.tcx.region_maps().call_site_extent(id, body.value.id), &fn_ret); if !fn_ret.is_never() && self.live_on_entry(entry_ln, self.s.no_ret_var).is_some() { diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs index 9db6dffb0e8..b398255aede 100644 --- a/src/librustc/middle/mem_categorization.rs +++ b/src/librustc/middle/mem_categorization.rs @@ -796,7 +796,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> { // The environment of a closure is guaranteed to // outlive any bindings introduced in the body of the // closure itself. - scope: self.tcx().region_maps.item_extent(fn_body_id), + scope: self.tcx().region_maps().item_extent(fn_body_id), bound_region: ty::BrEnv })); @@ -845,7 +845,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> { pub fn temporary_scope(&self, id: ast::NodeId) -> (&'tcx ty::Region, &'tcx ty::Region) { let (scope, old_scope) = - self.tcx().region_maps.old_and_new_temporary_scope(id); + self.tcx().region_maps().old_and_new_temporary_scope(id); (self.tcx().mk_region(match scope { Some(scope) => ty::ReScope(scope), None => ty::ReStatic diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index 0676075930d..18e76ff5011 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -16,7 +16,6 @@ //! Most of the documentation on regions can be found in //! `middle/infer/region_inference/README.md` -use dep_graph::DepNode; use hir::map as hir_map; use session::Session; use util::nodemap::{FxHashMap, NodeMap, NodeSet}; @@ -26,11 +25,15 @@ use std::cell::RefCell; use std::collections::hash_map::Entry; use std::fmt; use std::mem; +use std::rc::Rc; use syntax::codemap; use syntax::ast::{self, NodeId}; use syntax_pos::Span; +use ty::TyCtxt; +use ty::maps::Providers; use hir; +use hir::def_id::{CrateNum, LOCAL_CRATE}; use hir::intravisit::{self, Visitor, FnKind, NestedVisitorMap}; use hir::{Block, Item, FnDecl, Arm, Pat, PatKind, Stmt, Expr, Local}; @@ -44,8 +47,13 @@ impl fmt::Debug for CodeExtent { ty::tls::with_opt(|opt_tcx| { if let Some(tcx) = opt_tcx { - if let Some(data) = tcx.region_maps.code_extents.borrow().get(self.0 as usize) { - write!(f, "/{:?}", data)?; + let region_maps = tcx.region_maps(); + { + let code_extents = ®ion_maps.code_extents; + if let Some(data) = code_extents.borrow().get(self.0 as usize) { + write!(f, "/{:?}", data)?; + } + mem::drop(code_extents); // FIXME why is this necessary? } } Ok(()) @@ -1256,9 +1264,19 @@ impl<'hir, 'a> Visitor<'hir> for RegionResolutionVisitor<'hir, 'a> { } } -pub fn resolve_crate(sess: &Session, map: &hir_map::Map) -> RegionMaps { - let _task = map.dep_graph.in_task(DepNode::RegionResolveCrate); - let krate = map.krate(); +pub fn resolve_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Rc<RegionMaps> { + tcx.region_resolve_crate(LOCAL_CRATE) +} + +fn region_resolve_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, crate_num: CrateNum) + -> Rc<RegionMaps> +{ + debug_assert!(crate_num == LOCAL_CRATE); + + let sess = &tcx.sess; + let hir_map = &tcx.hir; + + let krate = hir_map.krate(); let maps = RegionMaps { code_extents: RefCell::new(vec![]), @@ -1279,7 +1297,7 @@ pub fn resolve_crate(sess: &Session, map: &hir_map::Map) -> RegionMaps { let mut visitor = RegionResolutionVisitor { sess: sess, region_maps: &maps, - map: map, + map: hir_map, cx: Context { root_id: None, parent: ROOT_CODE_EXTENT, @@ -1289,5 +1307,12 @@ pub fn resolve_crate(sess: &Session, map: &hir_map::Map) -> RegionMaps { }; krate.visit_all_item_likes(&mut visitor.as_deep_visitor()); } - return maps; + Rc::new(maps) +} + +pub fn provide(providers: &mut Providers) { + *providers = Providers { + region_resolve_crate, + ..*providers + }; } |
