Skip to content

Commit 8ffc944

Browse files
committed
Don't move stuff out of Compiler::enter.
1 parent 7d01b6c commit 8ffc944

File tree

2 files changed

+120
-122
lines changed

2 files changed

+120
-122
lines changed

src/librustdoc/core.rs

Lines changed: 102 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,9 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
344344
};
345345

346346
interface::run_compiler_in_existing_thread_pool(config, |compiler| {
347-
let sess = compiler.session();
347+
compiler.enter(|queries| {
348+
let sess = compiler.session();
348349

349-
let (resolver, mut global_ctxt) = compiler.enter(|queries| {
350350
// We need to hold on to the complete resolver, so we cause everything to be
351351
// cloned for the analysis passes to use. Suboptimal, but necessary in the
352352
// current architecture.
@@ -375,121 +375,119 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
375375
sess.fatal("Compilation failed, aborting rustdoc");
376376
}
377377

378-
let global_ctxt = abort_on_err(queries.global_ctxt(), sess).take();
379-
380-
(resolver, global_ctxt)
381-
});
382-
383-
global_ctxt.enter(|tcx| {
384-
tcx.analysis(LOCAL_CRATE).ok();
385-
386-
// Abort if there were any errors so far
387-
sess.abort_if_errors();
388-
389-
let access_levels = tcx.privacy_access_levels(LOCAL_CRATE);
390-
// Convert from a HirId set to a DefId set since we don't always have easy access
391-
// to the map from defid -> hirid
392-
let access_levels = AccessLevels {
393-
map: access_levels.map.iter()
394-
.map(|(&k, &v)| (tcx.hir().local_def_id(k), v))
395-
.collect()
396-
};
397-
398-
let mut renderinfo = RenderInfo::default();
399-
renderinfo.access_levels = access_levels;
400-
401-
let mut ctxt = DocContext {
402-
tcx,
403-
resolver,
404-
external_traits: Default::default(),
405-
active_extern_traits: Default::default(),
406-
renderinfo: RefCell::new(renderinfo),
407-
ty_substs: Default::default(),
408-
lt_substs: Default::default(),
409-
ct_substs: Default::default(),
410-
impl_trait_bounds: Default::default(),
411-
fake_def_ids: Default::default(),
412-
all_fake_def_ids: Default::default(),
413-
generated_synthetics: Default::default(),
414-
auto_traits: tcx.all_traits(LOCAL_CRATE).iter().cloned().filter(|trait_def_id| {
415-
tcx.trait_is_auto(*trait_def_id)
416-
}).collect(),
417-
};
418-
debug!("crate: {:?}", tcx.hir().krate());
419-
420-
let mut krate = clean::krate(&mut ctxt);
421-
422-
fn report_deprecated_attr(name: &str, diag: &errors::Handler) {
423-
let mut msg = diag.struct_warn(&format!("the `#![doc({})]` attribute is \
424-
considered deprecated", name));
425-
msg.warn("please see https://github.com/rust-lang/rust/issues/44136");
378+
let mut global_ctxt = abort_on_err(queries.global_ctxt(), sess).take();
379+
380+
global_ctxt.enter(|tcx| {
381+
tcx.analysis(LOCAL_CRATE).ok();
382+
383+
// Abort if there were any errors so far
384+
sess.abort_if_errors();
385+
386+
let access_levels = tcx.privacy_access_levels(LOCAL_CRATE);
387+
// Convert from a HirId set to a DefId set since we don't always have easy access
388+
// to the map from defid -> hirid
389+
let access_levels = AccessLevels {
390+
map: access_levels.map.iter()
391+
.map(|(&k, &v)| (tcx.hir().local_def_id(k), v))
392+
.collect()
393+
};
394+
395+
let mut renderinfo = RenderInfo::default();
396+
renderinfo.access_levels = access_levels;
397+
398+
let mut ctxt = DocContext {
399+
tcx,
400+
resolver,
401+
external_traits: Default::default(),
402+
active_extern_traits: Default::default(),
403+
renderinfo: RefCell::new(renderinfo),
404+
ty_substs: Default::default(),
405+
lt_substs: Default::default(),
406+
ct_substs: Default::default(),
407+
impl_trait_bounds: Default::default(),
408+
fake_def_ids: Default::default(),
409+
all_fake_def_ids: Default::default(),
410+
generated_synthetics: Default::default(),
411+
auto_traits: tcx.all_traits(LOCAL_CRATE).iter().cloned().filter(|trait_def_id| {
412+
tcx.trait_is_auto(*trait_def_id)
413+
}).collect(),
414+
};
415+
debug!("crate: {:?}", tcx.hir().krate());
416+
417+
let mut krate = clean::krate(&mut ctxt);
418+
419+
fn report_deprecated_attr(name: &str, diag: &errors::Handler) {
420+
let mut msg = diag.struct_warn(&format!("the `#![doc({})]` attribute is \
421+
considered deprecated", name));
422+
msg.warn("please see https://github.com/rust-lang/rust/issues/44136");
423+
424+
if name == "no_default_passes" {
425+
msg.help("you may want to use `#![doc(document_private_items)]`");
426+
}
426427

427-
if name == "no_default_passes" {
428-
msg.help("you may want to use `#![doc(document_private_items)]`");
428+
msg.emit();
429429
}
430430

431-
msg.emit();
432-
}
433-
434-
// Process all of the crate attributes, extracting plugin metadata along
435-
// with the passes which we are supposed to run.
436-
for attr in krate.module.as_ref().unwrap().attrs.lists(sym::doc) {
437-
let diag = ctxt.sess().diagnostic();
438-
439-
let name = attr.name_or_empty();
440-
if attr.is_word() {
441-
if name == sym::no_default_passes {
442-
report_deprecated_attr("no_default_passes", diag);
443-
if default_passes == passes::DefaultPassOption::Default {
444-
default_passes = passes::DefaultPassOption::None;
431+
// Process all of the crate attributes, extracting plugin metadata along
432+
// with the passes which we are supposed to run.
433+
for attr in krate.module.as_ref().unwrap().attrs.lists(sym::doc) {
434+
let diag = ctxt.sess().diagnostic();
435+
436+
let name = attr.name_or_empty();
437+
if attr.is_word() {
438+
if name == sym::no_default_passes {
439+
report_deprecated_attr("no_default_passes", diag);
440+
if default_passes == passes::DefaultPassOption::Default {
441+
default_passes = passes::DefaultPassOption::None;
442+
}
443+
}
444+
} else if let Some(value) = attr.value_str() {
445+
let sink = match name {
446+
sym::passes => {
447+
report_deprecated_attr("passes = \"...\"", diag);
448+
&mut manual_passes
449+
},
450+
sym::plugins => {
451+
report_deprecated_attr("plugins = \"...\"", diag);
452+
eprintln!("WARNING: `#![doc(plugins = \"...\")]` \
453+
no longer functions; see CVE-2018-1000622");
454+
continue
455+
},
456+
_ => continue,
457+
};
458+
for name in value.as_str().split_whitespace() {
459+
sink.push(name.to_string());
445460
}
446461
}
447-
} else if let Some(value) = attr.value_str() {
448-
let sink = match name {
449-
sym::passes => {
450-
report_deprecated_attr("passes = \"...\"", diag);
451-
&mut manual_passes
452-
},
453-
sym::plugins => {
454-
report_deprecated_attr("plugins = \"...\"", diag);
455-
eprintln!("WARNING: `#![doc(plugins = \"...\")]` no longer functions; \
456-
see CVE-2018-1000622");
457-
continue
458-
},
459-
_ => continue,
460-
};
461-
for name in value.as_str().split_whitespace() {
462-
sink.push(name.to_string());
463-
}
464-
}
465462

466-
if attr.is_word() && name == sym::document_private_items {
467-
if default_passes == passes::DefaultPassOption::Default {
468-
default_passes = passes::DefaultPassOption::Private;
463+
if attr.is_word() && name == sym::document_private_items {
464+
if default_passes == passes::DefaultPassOption::Default {
465+
default_passes = passes::DefaultPassOption::Private;
466+
}
469467
}
470468
}
471-
}
472469

473-
let passes = passes::defaults(default_passes).iter().chain(manual_passes.into_iter()
474-
.flat_map(|name| {
475-
if let Some(pass) = passes::find_pass(&name) {
476-
Some(pass)
477-
} else {
478-
error!("unknown pass {}, skipping", name);
479-
None
480-
}
481-
}));
470+
let passes = passes::defaults(default_passes).iter().chain(manual_passes.into_iter()
471+
.flat_map(|name| {
472+
if let Some(pass) = passes::find_pass(&name) {
473+
Some(pass)
474+
} else {
475+
error!("unknown pass {}, skipping", name);
476+
None
477+
}
478+
}));
482479

483-
info!("Executing passes");
480+
info!("Executing passes");
484481

485-
for pass in passes {
486-
debug!("running pass {}", pass.name);
487-
krate = (pass.pass)(krate, &ctxt);
488-
}
482+
for pass in passes {
483+
debug!("running pass {}", pass.name);
484+
krate = (pass.pass)(krate, &ctxt);
485+
}
489486

490-
ctxt.sess().abort_if_errors();
487+
ctxt.sess().abort_if_errors();
491488

492-
(krate, ctxt.renderinfo.into_inner(), render_options)
489+
(krate, ctxt.renderinfo.into_inner(), render_options)
490+
})
493491
})
494492
})
495493
}

src/librustdoc/test.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ pub fn run(options: Options) -> i32 {
8686
let display_warnings = options.display_warnings;
8787

8888
let tests = interface::run_compiler(config, |compiler| -> Result<_, ErrorReported> {
89-
let (mut collector, mut global_ctxt) = compiler.enter(|queries| {
89+
compiler.enter(|queries| {
9090
let lower_to_hir = queries.lower_to_hir()?;
9191

9292
let mut opts = scrape_test_config(lower_to_hir.peek().0.borrow().krate());
9393
opts.display_warnings |= options.display_warnings;
9494
let enable_per_target_ignores = options.enable_per_target_ignores;
95-
let collector = Collector::new(
95+
let mut collector = Collector::new(
9696
queries.crate_name()?.peek().to_string(),
9797
options,
9898
false,
@@ -102,24 +102,24 @@ pub fn run(options: Options) -> i32 {
102102
enable_per_target_ignores,
103103
);
104104

105-
let global_ctxt = queries.global_ctxt()?.take();
106-
Ok((collector, global_ctxt))
107-
})?;
108-
global_ctxt.enter(|tcx| {
109-
let krate = tcx.hir().krate();
110-
let mut hir_collector = HirCollector {
111-
sess: compiler.session(),
112-
collector: &mut collector,
113-
map: tcx.hir(),
114-
codes: ErrorCodes::from(compiler.session().opts
115-
.unstable_features.is_nightly_build()),
116-
};
117-
hir_collector.visit_testable("".to_string(), &krate.attrs, |this| {
118-
intravisit::walk_crate(this, krate);
105+
let mut global_ctxt = queries.global_ctxt()?.take();
106+
107+
global_ctxt.enter(|tcx| {
108+
let krate = tcx.hir().krate();
109+
let mut hir_collector = HirCollector {
110+
sess: compiler.session(),
111+
collector: &mut collector,
112+
map: tcx.hir(),
113+
codes: ErrorCodes::from(compiler.session().opts
114+
.unstable_features.is_nightly_build()),
115+
};
116+
hir_collector.visit_testable("".to_string(), &krate.attrs, |this| {
117+
intravisit::walk_crate(this, krate);
118+
});
119119
});
120-
});
121120

122-
Ok(collector.tests)
121+
Ok(collector.tests)
122+
})
123123
}).expect("compiler aborted in rustdoc!");
124124

125125
test_args.insert(0, "rustdoctest".to_string());

0 commit comments

Comments
 (0)