#[macro_export]
macro_rules! sel {
($name:ident) => ({
#[inline(always)]
fn register_sel(name_with_nul: &str) -> $crate::runtime::Sel {
let ptr = name_with_nul.as_ptr() as *const _;
unsafe { $crate::runtime::sel_registerName(ptr) }
}
register_sel(concat!(stringify!($name), '\0'))
});
($($name:ident :)+) => ({
#[inline(always)]
fn register_sel(name_with_nul: &str) -> $crate::runtime::Sel {
let ptr = name_with_nul.as_ptr() as *const _;
unsafe { $crate::runtime::sel_registerName(ptr) }
}
register_sel(concat!($(stringify!($name), ':'),+, '\0'))
});
}
#[macro_export]
macro_rules! msg_send {
(super($obj:expr, $superclass:expr), $name:ident) => ({
#[inline(always)]
unsafe fn to_mut<T>(ptr: &T) -> *mut T { ptr as *const T as *mut T }
let sel = sel!($name);
$crate::MessageArguments::send_super((), to_mut(&*$obj), $superclass, sel)
});
(super($obj:expr, $superclass:expr), $($name:ident : $arg:expr)+) => ({
#[inline(always)]
unsafe fn to_mut<T>(ptr: &T) -> *mut T { ptr as *const T as *mut T }
let sel = sel!($($name:)+);
$crate::MessageArguments::send_super(($($arg,)*), to_mut(&*$obj), $superclass, sel)
});
($obj:expr, $name:ident) => ({
#[inline(always)]
unsafe fn to_mut<T>(ptr: &T) -> *mut T { ptr as *const T as *mut T }
let sel = sel!($name);
$crate::MessageArguments::send((), to_mut(&*$obj), sel)
});
($obj:expr, $($name:ident : $arg:expr)+) => ({
#[inline(always)]
unsafe fn to_mut<T>(ptr: &T) -> *mut T { ptr as *const T as *mut T }
let sel = sel!($($name:)+);
$crate::MessageArguments::send(($($arg,)*), to_mut(&*$obj), sel)
});
}