main.rs 894 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #![no_std]
  2. #![feature(start)]
  3. extern crate alloc;
  4. extern crate unwinding;
  5. use alloc::{borrow::ToOwned, string::String};
  6. use unwinding::print::*;
  7. #[link(name = "c")]
  8. extern "C" {}
  9. struct PrintOnDrop(String);
  10. impl Drop for PrintOnDrop {
  11. fn drop(&mut self) {
  12. eprintln!("dropped: {:?}", self.0);
  13. }
  14. }
  15. struct PanicOnDrop;
  16. impl Drop for PanicOnDrop {
  17. fn drop(&mut self) {
  18. panic!("panic on drop");
  19. }
  20. }
  21. #[track_caller]
  22. fn foo() {
  23. panic!("panic");
  24. }
  25. fn bar() {
  26. let _p = PrintOnDrop("string".to_owned());
  27. foo()
  28. }
  29. fn main() {
  30. let _ = unwinding::panic::catch_unwind(|| {
  31. bar();
  32. eprintln!("done");
  33. });
  34. eprintln!("caught");
  35. let _p = PanicOnDrop;
  36. foo();
  37. }
  38. #[start]
  39. fn start(_argc: isize, _argv: *const *const u8) -> isize {
  40. unwinding::panic::catch_unwind(|| {
  41. main();
  42. 0
  43. })
  44. .unwrap_or(101)
  45. }