Skip to content

Commit eff39b7

Browse files
cramertjnikomatsakis
authored andcommitted
On-demandify region mapping
1 parent 06fb4d2 commit eff39b7

File tree

32 files changed

+146
-105
lines changed

32 files changed

+146
-105
lines changed

src/librustc/cfg/construct.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -583,11 +583,11 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
583583
scope_id: ast::NodeId,
584584
to_index: CFGIndex) {
585585
let mut data = CFGEdgeData { exiting_scopes: vec![] };
586-
let mut scope = self.tcx.region_maps.node_extent(from_expr.id);
587-
let target_scope = self.tcx.region_maps.node_extent(scope_id);
586+
let mut scope = self.tcx.region_maps().node_extent(from_expr.id);
587+
let target_scope = self.tcx.region_maps().node_extent(scope_id);
588588
while scope != target_scope {
589-
data.exiting_scopes.push(scope.node_id(&self.tcx.region_maps));
590-
scope = self.tcx.region_maps.encl_scope(scope);
589+
data.exiting_scopes.push(scope.node_id(&self.tcx.region_maps()));
590+
scope = self.tcx.region_maps().encl_scope(scope);
591591
}
592592
self.graph.add_edge(from_index, to_index, data);
593593
}

src/librustc/ich/impls_ty.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ impl<'a, 'tcx> HashStable<StableHashingContext<'a, 'tcx>> for ::middle::region::
438438
hcx: &mut StableHashingContext<'a, 'tcx>,
439439
hasher: &mut StableHasher<W>) {
440440
hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| {
441-
hcx.tcx().region_maps.code_extent_data(*self).hash_stable(hcx, hasher);
441+
hcx.tcx().region_maps().code_extent_data(*self).hash_stable(hcx, hasher);
442442
});
443443
}
444444
}

src/librustc/infer/error_reporting/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,14 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
123123
format!("{}unknown scope: {:?}{}. Please report a bug.",
124124
prefix, scope, suffix)
125125
};
126-
let span = match scope.span(&self.region_maps, &self.hir) {
126+
let span = match scope.span(&self.region_maps(), &self.hir) {
127127
Some(s) => s,
128128
None => {
129129
err.note(&unknown_scope());
130130
return;
131131
}
132132
};
133-
let tag = match self.hir.find(scope.node_id(&self.region_maps)) {
133+
let tag = match self.hir.find(scope.node_id(&self.region_maps())) {
134134
Some(hir_map::NodeBlock(_)) => "block",
135135
Some(hir_map::NodeExpr(expr)) => match expr.node {
136136
hir::ExprCall(..) => "call",
@@ -150,7 +150,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
150150
return;
151151
}
152152
};
153-
let scope_decorated_tag = match self.region_maps.code_extent_data(scope) {
153+
let scope_decorated_tag = match self.region_maps().code_extent_data(scope) {
154154
region::CodeExtentData::Misc(_) => tag,
155155
region::CodeExtentData::CallSiteScope { .. } => {
156156
"scope of call-site for function"
@@ -183,7 +183,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
183183
}
184184
};
185185

186-
let node = fr.scope.node_id(&self.region_maps);
186+
let node = fr.scope.node_id(&self.region_maps());
187187
let unknown;
188188
let tag = match self.hir.find(node) {
189189
Some(hir_map::NodeBlock(_)) |

src/librustc/infer/region_inference/graphviz.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ impl<'a, 'gcx, 'tcx> ConstraintGraph<'a, 'gcx, 'tcx> {
159159
add_node(n2);
160160
}
161161

162-
tcx.region_maps.each_encl_scope(|sub, sup| {
162+
tcx.region_maps().each_encl_scope(|sub, sup| {
163163
add_node(Node::Region(ty::ReScope(*sub)));
164164
add_node(Node::Region(ty::ReScope(*sup)));
165165
});
@@ -245,7 +245,7 @@ impl<'a, 'gcx, 'tcx> dot::GraphWalk<'a> for ConstraintGraph<'a, 'gcx, 'tcx> {
245245
fn edges(&self) -> dot::Edges<Edge<'tcx>> {
246246
debug!("constraint graph has {} edges", self.map.len());
247247
let mut v: Vec<_> = self.map.keys().map(|e| Edge::Constraint(*e)).collect();
248-
self.tcx.region_maps.each_encl_scope(|sub, sup| v.push(Edge::EnclScope(*sub, *sup)));
248+
self.tcx.region_maps().each_encl_scope(|sub, sup| v.push(Edge::EnclScope(*sub, *sup)));
249249
debug!("region graph has {} edges", v.len());
250250
Cow::Owned(v)
251251
}

src/librustc/infer/region_inference/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
938938
// A "free" region can be interpreted as "some region
939939
// at least as big as the block fr.scope_id". So, we can
940940
// reasonably compare free regions and scopes:
941-
let r_id = self.tcx.region_maps.nearest_common_ancestor(fr.scope, s_id);
941+
let r_id = self.tcx.region_maps().nearest_common_ancestor(fr.scope, s_id);
942942

943943
if r_id == fr.scope {
944944
// if the free region's scope `fr.scope_id` is bigger than
@@ -957,7 +957,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
957957
// subtype of the region corresponding to an inner
958958
// block.
959959
self.tcx.mk_region(ReScope(
960-
self.tcx.region_maps.nearest_common_ancestor(a_id, b_id)))
960+
self.tcx.region_maps().nearest_common_ancestor(a_id, b_id)))
961961
}
962962

963963
(&ReFree(a_fr), &ReFree(b_fr)) => {

src/librustc/middle/free_region.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@ impl FreeRegionMap {
136136
true,
137137

138138
(&ty::ReScope(sub_scope), &ty::ReScope(super_scope)) =>
139-
tcx.region_maps.is_subscope_of(sub_scope, super_scope),
139+
tcx.region_maps().is_subscope_of(sub_scope, super_scope),
140140

141141
(&ty::ReScope(sub_scope), &ty::ReFree(fr)) =>
142-
tcx.region_maps.is_subscope_of(sub_scope, fr.scope) ||
142+
tcx.region_maps().is_subscope_of(sub_scope, fr.scope) ||
143143
self.is_static(fr),
144144

145145
(&ty::ReFree(sub_fr), &ty::ReFree(super_fr)) =>

src/librustc/middle/liveness.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1441,7 +1441,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
14411441
// and must outlive the *call-site* of the function.
14421442
let fn_ret =
14431443
self.ir.tcx.liberate_late_bound_regions(
1444-
self.ir.tcx.region_maps.call_site_extent(id, body.value.id),
1444+
self.ir.tcx.region_maps().call_site_extent(id, body.value.id),
14451445
&fn_ret);
14461446

14471447
if !fn_ret.is_never() && self.live_on_entry(entry_ln, self.s.no_ret_var).is_some() {

src/librustc/middle/mem_categorization.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
796796
// The environment of a closure is guaranteed to
797797
// outlive any bindings introduced in the body of the
798798
// closure itself.
799-
scope: self.tcx().region_maps.item_extent(fn_body_id),
799+
scope: self.tcx().region_maps().item_extent(fn_body_id),
800800
bound_region: ty::BrEnv
801801
}));
802802

@@ -845,7 +845,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
845845
pub fn temporary_scope(&self, id: ast::NodeId) -> (&'tcx ty::Region, &'tcx ty::Region)
846846
{
847847
let (scope, old_scope) =
848-
self.tcx().region_maps.old_and_new_temporary_scope(id);
848+
self.tcx().region_maps().old_and_new_temporary_scope(id);
849849
(self.tcx().mk_region(match scope {
850850
Some(scope) => ty::ReScope(scope),
851851
None => ty::ReStatic

src/librustc/middle/region.rs

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
//! Most of the documentation on regions can be found in
1717
//! `middle/infer/region_inference/README.md`
1818
19-
use dep_graph::DepNode;
2019
use hir::map as hir_map;
2120
use session::Session;
2221
use util::nodemap::{FxHashMap, NodeMap, NodeSet};
@@ -26,11 +25,15 @@ use std::cell::RefCell;
2625
use std::collections::hash_map::Entry;
2726
use std::fmt;
2827
use std::mem;
28+
use std::rc::Rc;
2929
use syntax::codemap;
3030
use syntax::ast::{self, NodeId};
3131
use syntax_pos::Span;
32+
use ty::TyCtxt;
33+
use ty::maps::Providers;
3234

3335
use hir;
36+
use hir::def_id::{CrateNum, LOCAL_CRATE};
3437
use hir::intravisit::{self, Visitor, FnKind, NestedVisitorMap};
3538
use hir::{Block, Item, FnDecl, Arm, Pat, PatKind, Stmt, Expr, Local};
3639

@@ -44,8 +47,13 @@ impl fmt::Debug for CodeExtent {
4447

4548
ty::tls::with_opt(|opt_tcx| {
4649
if let Some(tcx) = opt_tcx {
47-
if let Some(data) = tcx.region_maps.code_extents.borrow().get(self.0 as usize) {
48-
write!(f, "/{:?}", data)?;
50+
let region_maps = tcx.region_maps();
51+
{
52+
let code_extents = &region_maps.code_extents;
53+
if let Some(data) = code_extents.borrow().get(self.0 as usize) {
54+
write!(f, "/{:?}", data)?;
55+
}
56+
mem::drop(code_extents); // FIXME why is this necessary?
4957
}
5058
}
5159
Ok(())
@@ -1256,9 +1264,19 @@ impl<'hir, 'a> Visitor<'hir> for RegionResolutionVisitor<'hir, 'a> {
12561264
}
12571265
}
12581266

1259-
pub fn resolve_crate(sess: &Session, map: &hir_map::Map) -> RegionMaps {
1260-
let _task = map.dep_graph.in_task(DepNode::RegionResolveCrate);
1261-
let krate = map.krate();
1267+
pub fn resolve_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Rc<RegionMaps> {
1268+
tcx.region_resolve_crate(LOCAL_CRATE)
1269+
}
1270+
1271+
fn region_resolve_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, crate_num: CrateNum)
1272+
-> Rc<RegionMaps>
1273+
{
1274+
debug_assert!(crate_num == LOCAL_CRATE);
1275+
1276+
let sess = &tcx.sess;
1277+
let hir_map = &tcx.hir;
1278+
1279+
let krate = hir_map.krate();
12621280

12631281
let maps = RegionMaps {
12641282
code_extents: RefCell::new(vec![]),
@@ -1279,7 +1297,7 @@ pub fn resolve_crate(sess: &Session, map: &hir_map::Map) -> RegionMaps {
12791297
let mut visitor = RegionResolutionVisitor {
12801298
sess: sess,
12811299
region_maps: &maps,
1282-
map: map,
1300+
map: hir_map,
12831301
cx: Context {
12841302
root_id: None,
12851303
parent: ROOT_CODE_EXTENT,
@@ -1289,5 +1307,12 @@ pub fn resolve_crate(sess: &Session, map: &hir_map::Map) -> RegionMaps {
12891307
};
12901308
krate.visit_all_item_likes(&mut visitor.as_deep_visitor());
12911309
}
1292-
return maps;
1310+
Rc::new(maps)
1311+
}
1312+
1313+
pub fn provide(providers: &mut Providers) {
1314+
*providers = Providers {
1315+
region_resolve_crate,
1316+
..*providers
1317+
};
12931318
}

src/librustc/traits/object_safety.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
207207

208208
// Search for a predicate like `Self : Sized` amongst the trait bounds.
209209
let free_substs = self.construct_free_substs(def_id,
210-
self.region_maps.node_extent(ast::DUMMY_NODE_ID));
210+
self.region_maps().node_extent(ast::DUMMY_NODE_ID));
211211
let predicates = self.predicates_of(def_id);
212212
let predicates = predicates.instantiate(self, free_substs).predicates;
213213
elaborate_predicates(self, predicates)

src/librustc/ty/context.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ use std::mem;
5151
use std::ops::Deref;
5252
use std::iter;
5353
use std::cmp::Ordering;
54+
use std::rc::Rc;
5455
use syntax::abi;
5556
use syntax::ast::{self, Name, NodeId};
5657
use syntax::attr;
@@ -439,8 +440,6 @@ pub struct GlobalCtxt<'tcx> {
439440

440441
pub named_region_map: resolve_lifetime::NamedRegionMap,
441442

442-
pub region_maps: RegionMaps,
443-
444443
pub hir: hir_map::Map<'tcx>,
445444
pub maps: maps::Maps<'tcx>,
446445

@@ -678,6 +677,10 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
678677
local as usize == global as usize
679678
}
680679

680+
pub fn region_maps(self) -> Rc<RegionMaps> {
681+
self.region_resolve_crate(LOCAL_CRATE)
682+
}
683+
681684
/// Create a type context and call the closure with a `TyCtxt` reference
682685
/// to the context. The closure enforces that the type context and any interned
683686
/// value (types, substs, etc.) can only be used while `ty::tls` has a valid
@@ -690,7 +693,6 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
690693
resolutions: ty::Resolutions,
691694
named_region_map: resolve_lifetime::NamedRegionMap,
692695
hir: hir_map::Map<'tcx>,
693-
region_maps: RegionMaps,
694696
lang_items: middle::lang_items::LanguageItems,
695697
stability: stability::Index<'tcx>,
696698
crate_name: &str,
@@ -714,7 +716,6 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
714716
dep_graph: dep_graph.clone(),
715717
types: common_types,
716718
named_region_map: named_region_map,
717-
region_maps: region_maps,
718719
variance_computed: Cell::new(false),
719720
trait_map: resolutions.trait_map,
720721
export_map: resolutions.export_map,

src/librustc/ty/maps.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use hir::def::Def;
1414
use hir;
1515
use middle::const_val;
1616
use middle::privacy::AccessLevels;
17+
use middle::region::RegionMaps;
1718
use mir;
1819
use session::CompileResult;
1920
use ty::{self, CrateInherentImpls, Ty, TyCtxt};
@@ -291,6 +292,12 @@ impl<'tcx> QueryDescription for queries::def_span<'tcx> {
291292
}
292293
}
293294

295+
impl<'tcx> QueryDescription for queries::region_resolve_crate<'tcx> {
296+
fn describe(_: TyCtxt, _: CrateNum) -> String {
297+
format!("resolve crate")
298+
}
299+
}
300+
294301
macro_rules! define_maps {
295302
(<$tcx:tt>
296303
$($(#[$attr:meta])*
@@ -571,6 +578,8 @@ define_maps! { <'tcx>
571578

572579
[] reachable_set: reachability_dep_node(CrateNum) -> Rc<NodeSet>,
573580

581+
[] region_resolve_crate: region_resolve_crate_dep_node(CrateNum) -> Rc<RegionMaps>,
582+
574583
[] mir_shims: mir_shim_dep_node(ty::InstanceDef<'tcx>) -> &'tcx RefCell<mir::Mir<'tcx>>,
575584

576585
[] def_symbol_name: SymbolName(DefId) -> ty::SymbolName,
@@ -592,6 +601,10 @@ fn reachability_dep_node(_: CrateNum) -> DepNode<DefId> {
592601
DepNode::Reachability
593602
}
594603

604+
fn region_resolve_crate_dep_node(_: CrateNum) -> DepNode<DefId> {
605+
DepNode::RegionResolveCrate
606+
}
607+
595608
fn mir_shim_dep_node(instance: ty::InstanceDef) -> DepNode<DefId> {
596609
instance.dep_node()
597610
}
@@ -608,4 +621,4 @@ fn typeck_item_bodies_dep_node(_: CrateNum) -> DepNode<DefId> {
608621

609622
fn const_eval_dep_node((def_id, _): (DefId, &Substs)) -> DepNode<DefId> {
610623
DepNode::ConstEval(def_id)
611-
}
624+
}

0 commit comments

Comments
 (0)