#[macro_export]
macro_rules! export_module {
[$($t:tt)*] => {
$crate::__export_go!(@go [] [] [] $($t)*);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __export_go {
(@go [$($fa:tt)*] [$($ca:tt)*] [$($va:tt)*]) => {
#[unsafe(no_mangle)]
pub extern "C" fn generic_plugin_init() -> *const $crate::ModuleDesc {
const FUNCTIONS: &[$crate::FunctionDesc] = &[ $($fa)* ];
const CLASSES: &[$crate::ClassDesc] = &[ $($ca)* ];
const VALUES: &[$crate::ValueDesc] = &[ $($va)* ];
static DESC: $crate::ModuleDesc = $crate::ModuleDesc {
abi_version: $crate::GENERIC_PLUGIN_ABI_VERSION,
functions: FUNCTIONS.as_ptr(),
functions_len: FUNCTIONS.len(),
classes: CLASSES.as_ptr(),
classes_len: CLASSES.len(),
values: VALUES.as_ptr(),
values_len: VALUES.len(),
};
&raw const DESC
}
};
(@go [$($fa:tt)*] [$($ca:tt)*] [$($va:tt)*] ($n:expr, $a:expr, $f:expr) $(, $($r:tt)*)?) => {
$crate::__export_go!(
@go [$($fa)* $crate::__function_desc!($n, $a, $f),] [$($ca)*] [$($va)*] $($($r)*)?
);
};
(@go [$($fa:tt)*] [$($ca:tt)*] [$($va:tt)*] class($cn:expr) { $($b:tt)* } $(, $($r:tt)*)?) => {
$crate::__export_go!(
@go [$($fa)*] [$($ca)* $crate::__class_desc!($cn, { $($b)* }),] [$($va)*] $($($r)*)?
);
};
(@go [$($fa:tt)*] [$($ca:tt)*] [$($va:tt)*] value($vn:expr, $vf:expr) $(, $($r:tt)*)?) => {
$crate::__export_go!(
@go [$($fa)*] [$($ca)*] [$($va)* $crate::__value_desc!($vn, $vf),] $($($r)*)?
);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __opt {
() => {
None
};
($e:expr) => {
Some($e)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __function_desc {
($name:expr, $arities:expr, $fun:expr) => {{
extern "C" fn wrapper(
host: *const $crate::HostApi,
args: *const $crate::GenericValue,
nargs: usize,
) -> $crate::FfiReturn {
unsafe { $crate::__invoke_plugin_fn($fun, host, args, nargs) }
}
const NAME: &str = $name;
const ARITIES: &[u8] = $arities;
$crate::FunctionDesc {
name: $crate::FfiStr {
ptr: NAME.as_ptr(),
len: NAME.len(),
},
arities: ARITIES.as_ptr(),
arities_len: ARITIES.len(),
fun: Some(wrapper),
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __value_desc {
($name:expr, $fun:expr) => {{
extern "C" fn wrapper(host: *const $crate::HostApi) -> $crate::FfiReturn {
unsafe { $crate::__invoke_plugin_value_fn($fun, host) }
}
const NAME: &str = $name;
$crate::ValueDesc {
name: $crate::FfiStr {
ptr: NAME.as_ptr(),
len: NAME.len(),
},
fun: Some(wrapper),
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __method_desc {
($name:expr, $arities:expr, $fun:expr) => {{
extern "C" fn wrapper(
host: *const $crate::HostApi,
receiver: $crate::GenericValue,
args: *const $crate::GenericValue,
nargs: usize,
) -> $crate::FfiReturn {
unsafe { $crate::__invoke_plugin_method_fn($fun, host, receiver, args, nargs) }
}
const NAME: &str = $name;
const ARITIES: &[u8] = $arities;
$crate::MethodDesc {
name: $crate::FfiStr {
ptr: NAME.as_ptr(),
len: NAME.len(),
},
arities: ARITIES.as_ptr(),
arities_len: ARITIES.len(),
fun: Some(wrapper),
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __class_desc {
($cname:expr, {
$( ($mn:expr, $ma:expr, $mf:expr) ),* $(,)?
$(drop: $drop:expr,)? $(traverse: $trav:expr,)?
}) => {{
const NAME: &str = $cname;
const METHODS: &[$crate::MethodDesc] =
&[ $( $crate::__method_desc!($mn, $ma, $mf) ),* ];
$crate::ClassDesc {
name: $crate::FfiStr { ptr: NAME.as_ptr(), len: NAME.len() },
methods: METHODS.as_ptr(),
methods_len: METHODS.len(),
drop: $crate::__opt!($($drop)?),
traverse: $crate::__opt!($($trav)?),
}
}};
}