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 arg
and args
methods. Set the result type with
res
. Change the calling convention, if necessary,
with abi
.
Once the builder is configured, construct a Cif
with
into_cif
or a closure with
into_closure
,
into_closure_mut
, or
into_closure_once
.
§Examples
use std::mem;
use std::os::raw::c_void;
use deno_libffi::middle::*;
use deno_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.
Sourcepub fn into_closure<U, R>(
self,
callback: Callback<U, R>,
userdata: &U,
) -> Closure<'_>
pub fn into_closure<U, R>( self, callback: Callback<U, R>, userdata: &U, ) -> Closure<'_>
Sourcepub fn into_closure_mut<U, R>(
self,
callback: CallbackMut<U, R>,
userdata: &mut U,
) -> Closure<'_>
pub fn into_closure_mut<U, R>( self, callback: CallbackMut<U, R>, userdata: &mut U, ) -> Closure<'_>
Sourcepub fn into_closure_once<U: Any, R>(
self,
callback: CallbackOnce<U, R>,
userdata: U,
) -> ClosureOnce
pub fn into_closure_once<U: Any, R>( self, callback: CallbackOnce<U, R>, userdata: U, ) -> ClosureOnce
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Builder
impl RefUnwindSafe for Builder
impl !Send for Builder
impl !Sync for Builder
impl Unpin for Builder
impl UnwindSafe for Builder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more