rustc/vendor/psm/examples/panics.rs
2020-07-26 20:51:33 +01:00

53 lines
1.6 KiB
Rust

extern crate psm;
use std::panic;
const CHAIN_DEPTH: usize = 16;
psm::psm_stack_manipulation! {
yes {
use std::alloc;
const STACK_ALIGN: usize = 4096;
// Generating backraces (because of RUST_BACKTRACE) create a few quite large frames, so it is
// important, that all frames have sufficient amount of available memory to not run over the
// stack...
const FRAME_SIZE: usize = 4096 * 10;
fn panic_chain(depth: usize) {
if depth == 0 {
panic!("full chain!");
} else {
unsafe {
let layout = alloc::Layout::from_size_align(FRAME_SIZE, STACK_ALIGN).unwrap();
let new_stack = alloc::alloc(layout);
assert!(!new_stack.is_null(), "allocations must succeed!");
let p = psm::on_stack(new_stack, FRAME_SIZE, || {
panic::catch_unwind(|| {
panic_chain(depth - 1);
})
});
alloc::dealloc(new_stack, layout);
p.map_err(panic::resume_unwind).unwrap()
}
}
}
fn main() {
panic_chain(CHAIN_DEPTH);
}
#[test]
fn run_example() {
assert!(panic::catch_unwind(|| {
panic_chain(CHAIN_DEPTH);
}).is_err(), "Panic did not propagate!");
}
}
no {
fn main() {
eprintln!("Stack manipulation not supported by this target");
}
}
}