pax_message/refcell_debug.rs
1// Taken from: https://users.rust-lang.org/t/dump-all-refcell-borrows/28315/4
2// ::cfg_if::cfg_if! { if #[cfg(debug_assertions)] {
3// #[derive(
4// Debug,
5// Clone,
6// Default,
7// PartialEq, Eq,
8// PartialOrd, Ord,
9// )]
10// pub struct RefCell<T> {
11// pub ref_cell: ::core::cell::RefCell<T>,
12//
13// pub last_borrow_context: ::core::cell::Cell<&'static str>,
14// }
15//
16// impl<T> RefCell<T> {
17// pub fn new (value: T) -> Self
18// {
19// RefCell {
20// ref_cell: ::core::cell::RefCell::new(value),
21// last_borrow_context: ::core::cell::Cell::new(""),
22// }
23// }
24// }
25//
26// #[macro_export]
27// macro_rules! borrow {(
28// $wrapper:expr
29// ) => ({
30// let wrapper = &$wrapper;
31// if let Ok(ret) = wrapper.ref_cell.try_borrow() {
32// wrapper
33// .last_borrow_context
34// .set(concat!(
35// "was still borrowed from ",
36// file!(), ":", line!(), ":", column!(),
37// " on expression ",
38// stringify!($wrapper),
39// ));
40// ret
41// } else {
42// panic!(
43// "Error, {} {}",
44// stringify!($wrapper),
45// wrapper.last_borrow_context.get(),
46// );
47// }
48// })}
49//
50// #[macro_export]
51// macro_rules! borrow_mut {(
52// $wrapper:expr
53// ) => ({
54// let wrapper = &$wrapper;
55// if let Ok(ret) = $wrapper.ref_cell.try_borrow_mut() {
56// $wrapper
57// .last_borrow_context
58// .set(concat!(
59// "was still mutably borrowed from ",
60// file!(), ":", line!(), ":", column!(),
61// " on expression ",
62// stringify!($wrapper),
63// ));
64// ret
65// } else {
66// panic!(
67// "Error, {} {}",
68// stringify!($wrapper),
69// wrapper.last_borrow_context.get(),
70// );
71// }
72// })}
73//
74// #[macro_export]
75// macro_rules! use_RefCell {() => (
76// pub use pax_runtime_api::RefCell;
77// )}
78// } else {
79#[macro_export]
80macro_rules! borrow {
81 (
82 $ref_cell:expr
83 ) => {
84 $ref_cell.borrow()
85 };
86}
87
88#[macro_export]
89macro_rules! borrow_mut {
90 (
91 $ref_cell:expr
92 ) => {
93 $ref_cell.borrow_mut()
94 };
95}
96#[macro_export]
97macro_rules! use_RefCell {
98 () => {
99 use ::core::cell::RefCell;
100 };
101}
102// }}