pub struct Builder { /* private fields */ }
Expand description
Provides a builder-style API for constructing CIFs and closures.
To use a builder, first construct it using Builder::new
. The
default calling convention is
ffi_abi_FFI_DEFAULT_ABI
,
and the default function type is extern "C" fn()
(or in C,
void(*)()
). Add argument types to the function type with the
Builder::arg
and args
methods. Set the result type
with Builder::res
. Change the calling convention, if necessary,
with Builder::abi
.
Once the builder is configured, construct a Cif
with
Builder::into_cif
or a closure with Builder::into_closure
,
into_closure_mut
, or
into_closure_once
.
Examples
use std::mem;
use std::os::raw::c_void;
use libffi::middle::*;
use libffi::low;
unsafe extern "C" fn lambda_callback<F: Fn(u64, u64) -> u64>(
_cif: &low::ffi_cif,
result: &mut u64,
args: *const *const c_void,
userdata: &F)
{
let args: *const &u64 = mem::transmute(args);
let arg1 = **args.offset(0);
let arg2 = **args.offset(1);
*result = userdata(arg1, arg2);
}
let lambda = |x: u64, y: u64| x + y;
let closure = Builder::new()
.arg(Type::u64())
.arg(Type::u64())
.res(Type::u64())
.into_closure(lambda_callback, &lambda);
unsafe {
let fun: &unsafe extern "C" fn(u64, u64) -> u64
= mem::transmute(closure.code_ptr());
assert_eq!(11, fun(5, 6));
assert_eq!(12, fun(5, 7));
}
Implementations§
source§impl Builder
impl Builder
sourcepub fn args<I>(self, types: I) -> Selfwhere
I: IntoIterator<Item = Type>,
pub fn args<I>(self, types: I) -> Selfwhere I: IntoIterator<Item = Type>,
Adds several types to the argument type list.