mozjs/gc/
macros.rs

1#[macro_export]
2macro_rules! rooted {
3	(in($cx:expr) let $($var:ident)+ = $init:expr) => {
4        let mut __root = ::std::mem::MaybeUninit::uninit();
5        let $($var)+ = $crate::gc::RootedGuard::new($cx, &mut __root, $init);
6    };
7	(in($cx:expr) let $($var:ident)+: $type:ty = $init:expr) => {
8        let mut __root = ::std::mem::MaybeUninit::uninit();
9        let $($var)+: $crate::gc::RootedGuard<$type> = $crate::gc::RootedGuard::new($cx, &mut __root, $init);
10    };
11	(in($cx:expr) let $($var:ident)+: $type:ty) => {
12        let mut __root = ::std::mem::MaybeUninit::uninit();
13        // SAFETY:
14        // We're immediately storing the initial value in a rooted location.
15        let $($var)+: $crate::gc::RootedGuard<$type> = $crate::gc::RootedGuard::new(
16            $cx,
17            &mut __root,
18            unsafe { <$type as $crate::gc::GCMethods>::initial() },
19        );
20    };
21}
22
23#[macro_export]
24macro_rules! rooted_vec {
25    (let mut $name:ident) => {
26        let mut __root = $crate::gc::RootableVec::new_unrooted();
27        let mut $name = $crate::gc::RootedVec::new(&mut __root);
28    };
29    (let $name:ident <- $iter:expr) => {
30        let mut __root = $crate::gc::RootableVec::new_unrooted();
31        let $name = $crate::gc::RootedVec::from_iter(&mut __root, $iter);
32    };
33    (let mut $name:ident <- $iter:expr) => {
34        let mut __root = $crate::gc::RootableVec::new_unrooted();
35        let mut $name = $crate::gc::RootedVec::from_iter(&mut __root, $iter);
36    };
37}
38
39#[macro_export]
40macro_rules! auto_root {
41    (in($cx:expr) let $($var:ident)+ = $init:expr) => {
42        let mut __root = $crate::gc::CustomAutoRooter::new($init);
43        let $($var)+ = __root.root($cx);
44    };
45	(in($cx:expr) let $($var:ident)+: $type:ty = $init:expr) => {
46        let mut __root = $crate::gc::CustomAutoRooter::new($init);
47        let $($var)+: $crate::rust::CustomAutoRootedGuard<$type> = __root.root($cx);
48    };
49}