run rustdoc tests in the same sort of thread rustc runs in
This commit is contained in:
parent
8780962828
commit
d25f066c07
2 changed files with 49 additions and 30 deletions
|
@ -82,6 +82,7 @@ use rustc::util::common::time;
|
||||||
|
|
||||||
use serialize::json::ToJson;
|
use serialize::json::ToJson;
|
||||||
|
|
||||||
|
use std::any::Any;
|
||||||
use std::cmp::max;
|
use std::cmp::max;
|
||||||
use std::cmp::Ordering::Equal;
|
use std::cmp::Ordering::Equal;
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
@ -1018,15 +1019,34 @@ fn parse_crate_attrs<'a>(sess: &'a Session, input: &Input) -> PResult<'a, Vec<as
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Runs `f` in a suitable thread for running `rustc`; returns a
|
||||||
|
/// `Result` with either the return value of `f` or -- if a panic
|
||||||
|
/// occurs -- the panic value.
|
||||||
|
pub fn in_rustc_thread<F, R>(f: F) -> Result<R, Box<Any + Send>>
|
||||||
|
where F: FnOnce() -> R + Send + 'static,
|
||||||
|
R: Send + 'static,
|
||||||
|
{
|
||||||
|
// Temporarily have stack size set to 16MB to deal with nom-using crates failing
|
||||||
|
const STACK_SIZE: usize = 16 * 1024 * 1024; // 16MB
|
||||||
|
|
||||||
|
let mut cfg = thread::Builder::new().name("rustc".to_string());
|
||||||
|
|
||||||
|
// FIXME: Hacks on hacks. If the env is trying to override the stack size
|
||||||
|
// then *don't* set it explicitly.
|
||||||
|
if env::var_os("RUST_MIN_STACK").is_none() {
|
||||||
|
cfg = cfg.stack_size(STACK_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
let thread = cfg.spawn(f);
|
||||||
|
thread.unwrap().join()
|
||||||
|
}
|
||||||
|
|
||||||
/// Run a procedure which will detect panics in the compiler and print nicer
|
/// Run a procedure which will detect panics in the compiler and print nicer
|
||||||
/// error messages rather than just failing the test.
|
/// error messages rather than just failing the test.
|
||||||
///
|
///
|
||||||
/// The diagnostic emitter yielded to the procedure should be used for reporting
|
/// The diagnostic emitter yielded to the procedure should be used for reporting
|
||||||
/// errors of the compiler.
|
/// errors of the compiler.
|
||||||
pub fn monitor<F: FnOnce() + Send + 'static>(f: F) {
|
pub fn monitor<F: FnOnce() + Send + 'static>(f: F) {
|
||||||
// Temporarily have stack size set to 16MB to deal with nom-using crates failing
|
|
||||||
const STACK_SIZE: usize = 16 * 1024 * 1024; // 16MB
|
|
||||||
|
|
||||||
struct Sink(Arc<Mutex<Vec<u8>>>);
|
struct Sink(Arc<Mutex<Vec<u8>>>);
|
||||||
impl Write for Sink {
|
impl Write for Sink {
|
||||||
fn write(&mut self, data: &[u8]) -> io::Result<usize> {
|
fn write(&mut self, data: &[u8]) -> io::Result<usize> {
|
||||||
|
@ -1040,20 +1060,12 @@ pub fn monitor<F: FnOnce() + Send + 'static>(f: F) {
|
||||||
let data = Arc::new(Mutex::new(Vec::new()));
|
let data = Arc::new(Mutex::new(Vec::new()));
|
||||||
let err = Sink(data.clone());
|
let err = Sink(data.clone());
|
||||||
|
|
||||||
let mut cfg = thread::Builder::new().name("rustc".to_string());
|
let result = in_rustc_thread(move || {
|
||||||
|
io::set_panic(Some(box err));
|
||||||
|
f()
|
||||||
|
});
|
||||||
|
|
||||||
// FIXME: Hacks on hacks. If the env is trying to override the stack size
|
if let Err(value) = result {
|
||||||
// then *don't* set it explicitly.
|
|
||||||
if env::var_os("RUST_MIN_STACK").is_none() {
|
|
||||||
cfg = cfg.stack_size(STACK_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
let thread = cfg.spawn(move || {
|
|
||||||
io::set_panic(Some(box err));
|
|
||||||
f()
|
|
||||||
});
|
|
||||||
|
|
||||||
if let Err(value) = thread.unwrap().join() {
|
|
||||||
// Thread panicked without emitting a fatal diagnostic
|
// Thread panicked without emitting a fatal diagnostic
|
||||||
if !value.is::<errors::FatalError>() {
|
if !value.is::<errors::FatalError>() {
|
||||||
let emitter =
|
let emitter =
|
||||||
|
|
|
@ -29,7 +29,7 @@ use rustc::session::config::{OutputType, OutputTypes, Externs};
|
||||||
use rustc::session::search_paths::{SearchPaths, PathKind};
|
use rustc::session::search_paths::{SearchPaths, PathKind};
|
||||||
use rustc_back::dynamic_lib::DynamicLibrary;
|
use rustc_back::dynamic_lib::DynamicLibrary;
|
||||||
use rustc_back::tempdir::TempDir;
|
use rustc_back::tempdir::TempDir;
|
||||||
use rustc_driver::{driver, Compilation};
|
use rustc_driver::{self, driver, Compilation};
|
||||||
use rustc_driver::driver::phase_2_configure_and_expand;
|
use rustc_driver::driver::phase_2_configure_and_expand;
|
||||||
use rustc_metadata::cstore::CStore;
|
use rustc_metadata::cstore::CStore;
|
||||||
use rustc_resolve::MakeGlobMap;
|
use rustc_resolve::MakeGlobMap;
|
||||||
|
@ -428,19 +428,26 @@ impl Collector {
|
||||||
should_panic: testing::ShouldPanic::No,
|
should_panic: testing::ShouldPanic::No,
|
||||||
},
|
},
|
||||||
testfn: testing::DynTestFn(box move |()| {
|
testfn: testing::DynTestFn(box move |()| {
|
||||||
runtest(&test,
|
match {
|
||||||
&cratename,
|
rustc_driver::in_rustc_thread(move || {
|
||||||
cfgs,
|
runtest(&test,
|
||||||
libs,
|
&cratename,
|
||||||
externs,
|
cfgs,
|
||||||
should_panic,
|
libs,
|
||||||
no_run,
|
externs,
|
||||||
as_test_harness,
|
should_panic,
|
||||||
compile_fail,
|
no_run,
|
||||||
error_codes,
|
as_test_harness,
|
||||||
&opts,
|
compile_fail,
|
||||||
maybe_sysroot);
|
error_codes,
|
||||||
})
|
&opts,
|
||||||
|
maybe_sysroot)
|
||||||
|
})
|
||||||
|
} {
|
||||||
|
Ok(()) => (),
|
||||||
|
Err(err) => panic::resume_unwind(err),
|
||||||
|
}
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue