Skip to content

Commit d0db96e

Browse files
committed
---
yaml --- r: 277817 b: refs/heads/try c: 983b4d3 h: refs/heads/master i: 277815: 2ae4914
1 parent ce8fc74 commit d0db96e

File tree

3 files changed

+57
-85
lines changed

3 files changed

+57
-85
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 6dbb0e86aec11050480beb76eade6fb805010ba7
33
refs/heads/snap-stage3: 235d77457d80b549dad3ac36d94f235208a1eafb
4-
refs/heads/try: 84284472533b1e48e6365f6c37b644d0fe00647a
4+
refs/heads/try: 983b4d3925a498cf6af96a0443f2235e69f761e5
55
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
66
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
77
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try/src/librustc_driver/driver.rs

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ use syntax::visit;
6161
use syntax;
6262
use syntax_ext;
6363

64+
pub struct Resolutions {
65+
pub def_map: RefCell<DefMap>,
66+
pub freevars: FreevarMap,
67+
pub trait_map: TraitMap,
68+
pub maybe_unused_trait_imports: NodeSet,
69+
}
70+
6471
pub fn compile_input(sess: &Session,
6572
cstore: &CStore,
6673
cfg: ast::CrateConfig,
@@ -147,23 +154,25 @@ pub fn compile_input(sess: &Session,
147154
"early lint checks",
148155
|| lint::check_ast_crate(sess, &expanded_crate));
149156

150-
let resolve::CrateMap {
151-
def_map,
152-
freevars,
153-
maybe_unused_trait_imports,
154-
export_map,
155-
trait_map,
156-
glob_map,
157-
} = time(sess.time_passes(), "name resolution", || {
158-
resolve::resolve_crate(sess, &expanded_crate, &defs.borrow(), control.make_glob_map)
159-
});
160-
161-
let analysis = ty::CrateAnalysis {
162-
export_map: export_map,
163-
access_levels: AccessLevels::default(),
164-
reachable: NodeSet(),
165-
name: &id,
166-
glob_map: glob_map,
157+
let (analysis, resolutions) = {
158+
resolve::with_resolver(sess, &defs.borrow(), control.make_glob_map, |mut resolver| {
159+
time(sess.time_passes(), "name resolution", || {
160+
resolve::resolve_crate(&mut resolver, &expanded_crate);
161+
});
162+
163+
(ty::CrateAnalysis {
164+
export_map: resolver.export_map,
165+
access_levels: AccessLevels::default(),
166+
reachable: NodeSet(),
167+
name: &id,
168+
glob_map: if resolver.make_glob_map { Some(resolver.glob_map) } else { None },
169+
}, Resolutions {
170+
def_map: RefCell::new(resolver.def_map),
171+
freevars: resolver.freevars,
172+
trait_map: resolver.trait_map,
173+
maybe_unused_trait_imports: resolver.maybe_unused_trait_imports,
174+
})
175+
})
167176
};
168177

169178
// Lower ast -> hir.
@@ -218,13 +227,10 @@ pub fn compile_input(sess: &Session,
218227

219228
phase_3_run_analysis_passes(sess,
220229
hir_map,
230+
analysis,
231+
resolutions,
221232
&arenas,
222233
&id,
223-
analysis,
224-
def_map,
225-
freevars,
226-
trait_map,
227-
maybe_unused_trait_imports,
228234
|tcx, mir_map, analysis, result| {
229235
{
230236
// Eventually, we will want to track plugins.
@@ -785,13 +791,10 @@ pub fn assign_node_ids(sess: &Session, krate: ast::Crate) -> ast::Crate {
785791
/// structures carrying the results of the analysis.
786792
pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
787793
hir_map: hir_map::Map<'tcx>,
794+
mut analysis: ty::CrateAnalysis,
795+
resolutions: Resolutions,
788796
arenas: &'tcx ty::CtxtArenas<'tcx>,
789797
name: &str,
790-
mut analysis: ty::CrateAnalysis,
791-
def_map: RefCell<DefMap>,
792-
freevars: FreevarMap,
793-
trait_map: TraitMap,
794-
maybe_unused_trait_imports: NodeSet,
795798
f: F)
796799
-> Result<R, usize>
797800
where F: FnOnce(&TyCtxt<'tcx>, Option<MirMap<'tcx>>, ty::CrateAnalysis, CompileResult) -> R
@@ -820,7 +823,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
820823
"lifetime resolution",
821824
|| middle::resolve_lifetime::krate(sess,
822825
&hir_map,
823-
&def_map.borrow()))?;
826+
&resolutions.def_map.borrow()))?;
824827

825828
time(time_passes,
826829
"looking for entry point",
@@ -840,17 +843,18 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
840843

841844
time(time_passes,
842845
"static item recursion checking",
843-
|| static_recursion::check_crate(sess, &def_map.borrow(), &hir_map))?;
846+
|| static_recursion::check_crate(sess, &resolutions.def_map.borrow(), &hir_map))?;
844847

845848
let index = stability::Index::new(&hir_map);
846849

850+
let trait_map = resolutions.trait_map;
847851
TyCtxt::create_and_enter(sess,
848852
arenas,
849-
def_map,
853+
resolutions.def_map,
850854
named_region_map,
851855
hir_map,
852-
freevars,
853-
maybe_unused_trait_imports,
856+
resolutions.freevars,
857+
resolutions.maybe_unused_trait_imports,
854858
region_map,
855859
lang_items,
856860
index,

branches/try/src/librustc_resolve/lib.rs

Lines changed: 20 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -995,11 +995,11 @@ pub struct Resolver<'a> {
995995
// The idents for the primitive types.
996996
primitive_type_table: PrimitiveTypeTable,
997997

998-
def_map: DefMap,
999-
freevars: FreevarMap,
998+
pub def_map: DefMap,
999+
pub freevars: FreevarMap,
10001000
freevars_seen: NodeMap<NodeMap<usize>>,
1001-
export_map: ExportMap,
1002-
trait_map: TraitMap,
1001+
pub export_map: ExportMap,
1002+
pub trait_map: TraitMap,
10031003

10041004
// A map from nodes to modules, both normal (`mod`) modules and anonymous modules.
10051005
// Anonymous modules are pseudo-modules that are implicitly created around items
@@ -1022,14 +1022,14 @@ pub struct Resolver<'a> {
10221022
// so as to avoid printing duplicate errors
10231023
emit_errors: bool,
10241024

1025-
make_glob_map: bool,
1025+
pub make_glob_map: bool,
10261026
// Maps imports to the names of items actually imported (this actually maps
10271027
// all imports, but only glob imports are actually interesting).
1028-
glob_map: GlobMap,
1028+
pub glob_map: GlobMap,
10291029

10301030
used_imports: HashSet<(NodeId, Namespace)>,
10311031
used_crates: HashSet<CrateNum>,
1032-
maybe_unused_trait_imports: NodeSet,
1032+
pub maybe_unused_trait_imports: NodeSet,
10331033

10341034
privacy_errors: Vec<PrivacyError<'a>>,
10351035

@@ -3563,27 +3563,14 @@ fn err_path_resolution() -> PathResolution {
35633563
}
35643564

35653565

3566-
pub struct CrateMap {
3567-
pub def_map: RefCell<DefMap>,
3568-
pub freevars: FreevarMap,
3569-
pub maybe_unused_trait_imports: NodeSet,
3570-
pub export_map: ExportMap,
3571-
pub trait_map: TraitMap,
3572-
pub glob_map: Option<GlobMap>,
3573-
}
3574-
35753566
#[derive(PartialEq,Copy, Clone)]
35763567
pub enum MakeGlobMap {
35773568
Yes,
35783569
No,
35793570
}
35803571

35813572
/// Entry point to crate resolution.
3582-
pub fn resolve_crate<'a>(session: &'a Session,
3583-
krate: &'a Crate,
3584-
definitions: &'a Definitions,
3585-
make_glob_map: MakeGlobMap)
3586-
-> CrateMap {
3573+
pub fn resolve_crate<'a, 'b>(resolver: &'b mut Resolver<'a>, krate: &'b Crate) {
35873574
// Currently, we ignore the name resolution data structures for
35883575
// the purposes of dependency tracking. Instead we will run name
35893576
// resolution and include its output in the hash of each item,
@@ -3592,42 +3579,23 @@ pub fn resolve_crate<'a>(session: &'a Session,
35923579
// resolution on those contents. Hopefully we'll push this back at
35933580
// some point.
35943581

3595-
let arenas = Resolver::arenas();
3596-
let mut resolver = create_resolver(session, definitions, krate, make_glob_map, &arenas);
3597-
3582+
resolver.build_reduced_graph(krate);
3583+
resolve_imports::resolve_imports(resolver);
35983584
resolver.resolve_crate(krate);
35993585

3600-
check_unused::check_crate(&mut resolver, krate);
3586+
check_unused::check_crate(resolver, krate);
36013587
resolver.report_privacy_errors();
3602-
3603-
CrateMap {
3604-
def_map: RefCell::new(resolver.def_map),
3605-
freevars: resolver.freevars,
3606-
maybe_unused_trait_imports: resolver.maybe_unused_trait_imports,
3607-
export_map: resolver.export_map,
3608-
trait_map: resolver.trait_map,
3609-
glob_map: if resolver.make_glob_map {
3610-
Some(resolver.glob_map)
3611-
} else {
3612-
None
3613-
},
3614-
}
36153588
}
36163589

3617-
/// Builds a name resolution walker.
3618-
fn create_resolver<'a>(session: &'a Session,
3619-
definitions: &'a Definitions,
3620-
krate: &'a Crate,
3621-
make_glob_map: MakeGlobMap,
3622-
arenas: &'a ResolverArenas<'a>)
3623-
-> Resolver<'a> {
3624-
let mut resolver = Resolver::new(session, definitions, make_glob_map, arenas);
3625-
3626-
resolver.build_reduced_graph(krate);
3627-
3628-
resolve_imports::resolve_imports(&mut resolver);
3629-
3630-
resolver
3590+
pub fn with_resolver<'a, T, F>(session: &'a Session,
3591+
definitions: &'a Definitions,
3592+
make_glob_map: MakeGlobMap,
3593+
f: F) -> T
3594+
where F: for<'b> FnOnce(Resolver<'b>) -> T,
3595+
{
3596+
let arenas = Resolver::arenas();
3597+
let resolver = Resolver::new(session, definitions, make_glob_map, &arenas);
3598+
f(resolver)
36313599
}
36323600

36333601
__build_diagnostic_array! { librustc_resolve, DIAGNOSTICS }

0 commit comments

Comments
 (0)