Struct deno_libffi::middle::Builder [−][src]
pub struct Builder { /* fields omitted */ }
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
Adds several types to the argument type list.
pub 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<'_>
pub 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 RefUnwindSafe for Builder
impl UnwindSafe for Builder
Blanket Implementations
Mutably borrows from an owned value. Read more