1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#[macro_export] macro_rules! codegen_allocator { ({ type: class, name: $name:tt, meta: $meta:tt, struct: (), methods: $methods:tt }) => (); ({ type: class, name: $cls:tt, meta: { pub: $pub:tt, reopen: false }, struct: $struct:tt, methods: [ $($method:tt)* ] }) => ( impl $cls { extern "C" fn __mark__(_klass: &$cls) {} extern "C" fn __free__(_klass: Option<Box<$cls>>) {} #[inline] fn __alloc_with__(rust_self: Option<Box<$cls>>) -> $crate::sys::VALUE { use ::std::mem::transmute; unsafe { let instance = $crate::sys::Data_Wrap_Struct( transmute($cls), transmute($cls::__mark__ as usize), transmute($cls::__free__ as usize), transmute(rust_self) ); instance } } } ) }